Date: Tue, 15 Feb 2005 14:03:12 -0700 From: Scott Long <scottl@samsco.org> To: Andrew Gallatin <gallatin@cs.duke.edu> Cc: freebsd-hackers@freebsd.org Subject: Re: mapping small parts of a pci card to conserve KVA Message-ID: <42126390.5020804@samsco.org> In-Reply-To: <16914.22016.593790.719399@grasshopper.cs.duke.edu> References: <16914.22016.593790.719399@grasshopper.cs.duke.edu>
next in thread | previous in thread | raw e-mail | index | archive | help
Andrew Gallatin wrote: > I maintain drivers for a PCI card which presents itself as having > 16MB of address space. Eg: > > mx0: <Myrinet PCIXE> mem 0xf9000000-0xf9ffffff irq 20 at device 3.0 on pci1 > > However, most of that address space does not need to be mapped into > the host. Really, only a little over 2MB needs to be mapped (3 regions > with length 1024 bytes, 256 bytes, and 2MB). > > I've tried to re-write things so that I make multiple calls > to bus_alloc_resource() with the (hopefully) appropriate offset and > lengths. Eg: > > rid = PCIR_MAPS; > *res = bus_alloc_resource(is->arch.dev, SYS_RES_MEMORY, &rid, > (u_long)offset, > (u_long)(offset + len - 1), len, > RF_ACTIVE|PCI_RF_DENSE); > > At least on 5.3R, I seem to get back the same struct resource * from > each call. rman_get_virtual() returns a different kva for each > mapping, yet they all seem to map to the same physical address. > Eg, I call vtophys() on the results of rman_get_virtual(), > for each segment, and they all map to 0xf9000000. > > Is there a way to just map what I need? > > Thanks, > > Drew > You can use pmap_mapdev() to create a KVA mapping of an arbitrary physaddr+len. In fact, this is exactly what newbus uses to create the PCI MEMIO resources when bus_alloc_resource() is called. I'm not sure if the range is mapped and activated before the driver makes that call, Warner or John might know for sure. Scott
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?42126390.5020804>