Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Apr 2005 15:17:11 +0530
From:      Dipjyoti Saikia <dipjyoti.saikia@gmail.com>
To:        Cole <cole@opteqint.net>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: PCI Programming
Message-ID:  <dcbc809d05042902473b0b4599@mail.gmail.com>
In-Reply-To: <000901c54c19$3dba2570$4206000a@deadmind>
References:  <000901c54c19$3dba2570$4206000a@deadmind>

index | next in thread | previous in thread | raw e-mail

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@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@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
>


help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?dcbc809d05042902473b0b4599>