nouveau: Add an mtrr over the whole FB

main
Stephane Marchesin 2007-01-05 20:49:34 +01:00
parent f80659bc29
commit 025f281bbf
3 changed files with 20 additions and 1 deletions

View File

@ -42,6 +42,7 @@ static struct drm_driver driver = {
DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
.load = nouveau_load,
.firstopen = nouveau_firstopen,
.lastclose = nouveau_lastclose,
.unload = nouveau_unload,
.preclose = nouveau_preclose,
.irq_preinstall = nouveau_irq_preinstall,

View File

@ -129,6 +129,9 @@ typedef struct drm_nouveau_private {
uint64_t fb_phys;
uint64_t agp_phys;
/* the mtrr covering the FB */
int fb_mtrr;
struct mem_block *agp_heap;
struct mem_block *fb_heap;
struct mem_block *fb_nomap_heap;
@ -142,6 +145,7 @@ drm_nouveau_private_t;
extern void nouveau_preclose(drm_device_t * dev, DRMFILE filp);
extern int nouveau_load(struct drm_device *dev, unsigned long flags);
extern int nouveau_firstopen(struct drm_device *dev);
extern void nouveau_lastclose(struct drm_device *dev);
extern int nouveau_unload(struct drm_device *dev);
extern int nouveau_ioctl_getparam(DRM_IOCTL_ARGS);
extern int nouveau_ioctl_setparam(DRM_IOCTL_ARGS);

View File

@ -46,7 +46,7 @@ int nouveau_firstopen(struct drm_device *dev)
/* resource 0 is mmio regs */
/* resource 1 is linear FB */
/* resource 2 is ??? (mmio regs + 0x1000000) */
/* resource 2 is RAMIN (mmio regs + 0x1000000) */
/* resource 6 is bios */
/* map the mmio regs */
@ -71,6 +71,11 @@ int nouveau_firstopen(struct drm_device *dev)
ret = nouveau_fifo_init(dev);
if (ret) return ret;
#if __OS_HAS_MTRR
/* setup a mtrr over the FB */
dev_priv->fb_mtrr=drm_mtrr_add(drm_get_resource_start(dev, 1),nouveau_mem_fb_amount(dev), DRM_MTRR_WC);
#endif
/* FIXME: doesn't belong here, and have no idea what it's for.. */
if (dev_priv->card_type >= NV_40)
nv40_graph_init(dev);
@ -98,6 +103,15 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
return 0;
}
void nouveau_lastclose(struct drm_device *dev)
{
#if __OS_HAS_MTRR
drm_nouveau_private_t *dev_priv = dev->dev_private;
if(dev_priv->fb_mtrr>0)
drm_mtrr_del(dev_priv->fb_mtrr, drm_get_resource_start(dev, 1),nouveau_mem_fb_amount(dev), DRM_MTRR_WC);
#endif
}
int nouveau_unload(struct drm_device *dev)
{
drm_free(dev->dev_private, sizeof(*dev->dev_private), DRM_MEM_DRIVER);