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

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Jun 25, 2010 at 8:18 PM, Daniel O'Connor <doconnor@gsoft.com.au>wrote:

>
> 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 = rman_get_start(sc->g_membase.reshandle) + offset;
>
> 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,
    Cool, that looks like what I am looking for.  I'll go and read up on it,
thanks very much.  I am using the Xilinx SP605
http://www.xilinx.com/products/devkits/EK-S6-SP605-G.htm
perfect for playing with hardware for a frame buffer device or graphics
device.  It comes with a full license for the synthesis and PCIe IP for the
device on that board which is a great deal.
Christopher

--
> 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?AANLkTimK3OeOQzw__wxPPG2DY8gXTggep7kl3oF8vKUl>