NVIDIA FreeBSD kernel feature requests

Christian Zander czander at nvidia.com
Mon Jul 3 12:02:33 UTC 2006


On Sun, Jul 02, 2006 at 10:02:17PM -0600, M. Warner Losh wrote:
> In message: <20060629111231.GA692 at wolf.nvidia.com>
>             Christian Zander <czander at nvidia.com> writes:
> : This summary makes an attempt to describe the kernel interfaces needed by
> : the NVIDIA FreeBSD i386 graphics driver to achieve feature parity with
> : the Linux/Solaris graphics drivers, and/or required to make support for
> : the FreeBSD amd64 platform feasible. It also describes some of the
> : technical difficulties encountered by NVIDIA during the FreeBSD i386
> : graphics driver's development, how these problems have been worked around
> : and what could be done to solve them better.
> 
> Thank you for taking the time to let us know how we might make the
> system better.
> 
> :    The NVIDIA graphics driver needs to be able to create uncached kernel
> :    and user mappings of I/O memory, such as NVIDIA GPU registers. The
> :    FreeBSD kernel does not currently provide the interfaces necessary to
> :    specify the memory type when creating such mappings, which makes it
> :    difficult for the NVIDIA graphics driver to guarantee that the correct
> :    memory type is selected.
> 
> Is this via the bus_alloc_resource interface?  Is uncached kernel
> memory different than non-prefetchable memory?  If so, please specify
> how it is different.  If not, then we have an interface that will do
> what you want, except it is only implemented for cardbus and would
> need to be implemented for pci pci and pci host bridges.  Would having
> better functionality here help?  I noticed it wasn't on the task list...
> 

The I/O memory in question is non-prefetchable. The NVIDIA FreeBSD
graphics driver currently uses the bus_alloc_resource() interface
without the RF_ACTIVE flag and then uses pmap_mapdev() to obtain
kernel mappings of the I/O memory, which it then updates with the
PCD/PWT flags to force them to be uncached. User mappings are created
via mmap(); they use the effective memory type derived from the MTRR
configuration. If you're interested in taking a look, the FreeBSD
kernel specific interface code is included with the NVIDIA graphics
driver.

John is working on pmap_mapdev_attr(), which is built on top of the
PAT support he is adding, and this interface will allow the caller to
request a specific memory type to use for the mapping, handling the
details transparently (e.g. the direct mapping on FreeBSD amd64). It
would probably be useful if the bus_alloc_resource() interface
supported this functionality, but the NVIDIA graphics driver would
still need to use the pmap_mapdev_attr() interface, e.g. for its AGP
GART driver.

The current plan is to replace pmap_mapdev() with pmap_mapdev_attr()
in the driver when the latter interface becomes available.

Thanks,


> Warner

-- 
christian zander
ch?zander at nvidia.com


More information about the freebsd-hackers mailing list