Subject: Re: multi function PCI devices with shared registers
To: Johan Danielsson <joda@pdc.kth.se>
From: Stefan Grefen <grefen@hprc.tandem.com>
List: tech-kern
Date: 03/04/1999 18:09:40
In message <xofr9r7v6fu.fsf@blubb.pdc.kth.se> Johan Danielsson wrote:
>
> Let's say I have a PCI device with more than one function, and the
> device has some I/O map register that is shared between the two
> functions (that is the register points to the same io address).
>
> How can this be handled when attaching the device? I would like to get
> a pointer (or something) to the first function when attaching the
> second.
>
> The same problem arises with registers that `should be written only
> through function 0'.
>
> Is there some code that does something like this in the tree?
No code in the tree, but you can write a driver which probes the
additional function as it likes (and just maps registers once, or
takes care of useing function 0 for certain things).
Basic code to do it :
In match return 1; only for fucntion 0 (or ignore the others in
...attach).
in ...attach:
struct pci_attach_args *pa = aux,tpa[NDEVS];
pci_chipset_tag_t pc = pa->pa_pc;
for (i = 0 ;i <NDEVS ; i++) {
int bus,dev;
tpa[i] = *pa;
if (i) {
pci_decompose_tag(pc,pa->pa_tag,&bus,&dev,NULL);
tpa[i].pa_tag[i] = pci_make_tag(pc,bus,dev,i);
tpa[i].pa_function = i;
}
....
}
Now you can all pci_mapreg_map(&tpa[i], ... ), and
have valid tags etc.A
Stefan
>
> /Johan
--
Stefan Grefen Tandem Computers Europe Inc.
grefen@hprc.tandem.com High Performance Research Center
--- Hacking's just another word for nothing left to kludge. ---