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>

next in thread | previous in thread | raw e-mail | index | archive | help
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();  =20
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
>=20
> 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.
>=20
> Heres the function up to the point where im getting stuck.
>=20
> int FindDevice( void )
> {
>=20
>    static struct pci_dev *pciptr;
>    int pci_info_index =3D 0;
>    U16 wDev;
>    unsigned int tmp_addr;
>=20
>        /*-----------------------------------------*/
> #ifdef CONFIG_PCI  // find the specified device and its configuration
>  if( pcibios_present() ){
>=20
>    pci_for_each_dev( pciptr ){
>        if ((pciptr->vendor =3D=3D VENDOR_ID) && \
>            (pciptr->device =3D=3D DEVICE_ID) && \
>            (pciptr->subsystem_vendor =3D=3D SUBSYSTEM_VID) && \
>            (pciptr->subsystem_device =3D=3D SUBSYSTEM_DID) && \
>            (PCI_FUNC(pciptr->devfn) =3D=3D 0) )
>        {
>                    DevExtension[pci_info_index].wBus=3D pciptr->bus->numb=
er;
>                    DevExtension[pci_info_index].wDevFunc=3D pciptr->devfn=
;
>                    DevExtension[pci_info_index].wCard =3D pci_info_index;
>                    tmp_addr =3D pci_resource_start( pciptr, 4 );
>                    DevExtension[pci_info_index].func0_bar =3D (tmp_addr &=
 ~0x03);
>=20
> now the function im getting stuck at, is the "tmp_addr =3D pci_resource_s=
tart(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.
>=20
> If anyone has any sample code or anything that I could read to proceed an=
y further, it would be greatly appreciated.
>=20
> Regards
> /Cole
>=20
> _______________________________________________
> 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=
"
>



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