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