PCI Programming

Dipjyoti Saikia dipjyoti.saikia at gmail.com
Fri Apr 29 02:47:13 PDT 2005


Hi,

The normal usage of pci_resource_start() in Linux is to get the base
address of the BAR  for further reads/writes using inb/outb etc.

In Free BSD   you can use the following :

bus_alloc_resource();   
rman_get_bustag();
rman_get_bushandle();

Usually the ret value of rman_get_bushandle() gives the starting
address of the resource (of the BAR for which you called
bus_alloc_resource) .

Normally we use bus_space_* api's to read/write in FreeBSD. The use of
bus_space_ functions need us to only specify the offset rather than
the Linux like usage
  inb(base+offset) etc.

Thanks
Dip

On 4/28/05, Cole <cole at opteqint.net> wrote:
> Hey
> 
> Im currently trying to port some linux pci driver to FreeBSD code. But im running into a  problem. Its using a function that I cant
> seem to find the equivalent of for FreeBSD.
> 
> Heres the function up to the point where im getting stuck.
> 
> int FindDevice( void )
> {
> 
>    static struct pci_dev *pciptr;
>    int pci_info_index = 0;
>    U16 wDev;
>    unsigned int tmp_addr;
> 
>        /*-----------------------------------------*/
> #ifdef CONFIG_PCI  // find the specified device and its configuration
>  if( pcibios_present() ){
> 
>    pci_for_each_dev( pciptr ){
>        if ((pciptr->vendor == VENDOR_ID) && \
>            (pciptr->device == DEVICE_ID) && \
>            (pciptr->subsystem_vendor == SUBSYSTEM_VID) && \
>            (pciptr->subsystem_device == SUBSYSTEM_DID) && \
>            (PCI_FUNC(pciptr->devfn) == 0) )
>        {
>                    DevExtension[pci_info_index].wBus= pciptr->bus->number;
>                    DevExtension[pci_info_index].wDevFunc= pciptr->devfn;
>                    DevExtension[pci_info_index].wCard = pci_info_index;
>                    tmp_addr = pci_resource_start( pciptr, 4 );
>                    DevExtension[pci_info_index].func0_bar = (tmp_addr & ~0x03);
> 
> now the function im getting stuck at, is the "tmp_addr = pci_resource_start(pciptr, 4). I was wondering if anyone knows of an
> equivalent under FreeBSD. Or if there is a way to obtain that value with some other method in FreeBSD. I am pretty much fine up
> until that point.
> 
> If anyone has any sample code or anything that I could read to proceed any further, it would be greatly appreciated.
> 
> Regards
> /Cole
> 
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>


More information about the freebsd-hackers mailing list