From owner-freebsd-hackers@FreeBSD.ORG Sat Jun 26 03:19:12 2010 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C498B106566B for ; Sat, 26 Jun 2010 03:19:12 +0000 (UTC) (envelope-from doconnor@gsoft.com.au) Received: from cain.gsoft.com.au (cain.gsoft.com.au [203.31.81.10]) by mx1.freebsd.org (Postfix) with ESMTP id 303708FC08 for ; Sat, 26 Jun 2010 03:19:11 +0000 (UTC) Received: from ur.dons.net.au (ppp121-45-156-127.lns6.adl6.internode.on.net [121.45.156.127]) (authenticated bits=0) by cain.gsoft.com.au (8.14.4/8.14.3) with ESMTP id o5Q3Iwwq058012 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Sat, 26 Jun 2010 12:49:04 +0930 (CST) (envelope-from doconnor@gsoft.com.au) Mime-Version: 1.0 (Apple Message framework v1081) Content-Type: text/plain; charset=us-ascii From: "Daniel O'Connor" In-Reply-To: Date: Sat, 26 Jun 2010 12:48:57 +0930 Content-Transfer-Encoding: quoted-printable Message-Id: <02DA6157-87CE-47E5-91D0-ED014FB88AD0@gsoft.com.au> References: To: Christopher Bowman X-Mailer: Apple Mail (2.1081) X-Spam-Score: 0.163 () BAYES_00,RDNS_DYNAMIC X-Scanned-By: MIMEDefang 2.67 on 203.31.81.10 Cc: freebsd-hackers@freebsd.org Subject: Re: PCI Express and drivers X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 26 Jun 2010 03:19:12 -0000 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