Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Jun 2010 12:48:57 +0930
From:      "Daniel O'Connor" <doconnor@gsoft.com.au>
To:        Christopher Bowman <crb@chrisbowman.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: PCI Express and drivers
Message-ID:  <02DA6157-87CE-47E5-91D0-ED014FB88AD0@gsoft.com.au>
In-Reply-To: <AANLkTinMvJnvsmE6NvOKjtcAVn6JEl-kB-AjdWMpXpZd@mail.gmail.com>
References:  <AANLkTinMvJnvsmE6NvOKjtcAVn6JEl-kB-AjdWMpXpZd@mail.gmail.com>

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

On 26/06/2010, at 3:01, Christopher Bowman wrote:
> I have a Xilinx PCI Express board that has an on board PCIe interface
> macro.  I intend to have an address space with memory and another with =
my
> devices control registers.  I wish to program this board under =
FreeBSD.  It
> would seem to me that the way to do this would be to write a driver =
that
> would allow me to map these two address spaces into a user process =
which
> could then directly interact with the device.  In my case my board =
doesn't
> really support multiple users, and it doesn't really seem to make =
sense to
> me to put a lot of code in the kernel to create some sort of interface =
to
> allow multiple processes to interact with my device via some sort of =
syscall
> which would impose a lot of overhead in any case.  By mapping the =
address
> ranges into a user process I can write user programs to drive the =
board
> without having to recompile and reboot the kernel each time I make a =
change,
> plus if I do something stupid and crash my user space process it =
shouldn't
> bring down the whole kernel.  Am I thinking about this wrong?  Is =
there some
> place I can go to read up on what I should be doing?  If I am thinking =
about
> this correctly, then how does one map device memory into a user space
> process?  How does one make sure that only one process has such a =
mapping?

You could use mmap() I think,

For a driver I maintain I did the following ->
 /* Magic sauce stolen from src/sys/pci/xrpu.c via phk
  * =
http://www.mail-archive.com/freebsd-hackers%40freebsd.org/msg11729.html
  */
  *paddr =3D rman_get_start(sc->g_membase.reshandle) + offset;
   =20
g_membase is..
    struct resource	*reshandle;	/* Resource handle */
    bus_space_tag_t	sc_st;		/* bus space tag */
    bus_space_handle_t	sc_sh;		/* bus space handle */

PS what board are you using? :)

--
Daniel O'Connor software and network engineer
for Genesis Software - http://www.gsoft.com.au
"The nice thing about standards is that there
are so many of them to choose from."
  -- Andrew Tanenbaum
GPG Fingerprint - 5596 B766 97C0 0E94 4347 295E E593 DC20 7B3F CE8C









Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?02DA6157-87CE-47E5-91D0-ED014FB88AD0>