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>