diff options
| author | Alan Hourihane <alanh@tungstengraphics.com> | 2008-03-12 10:18:33 +0000 | 
|---|---|---|
| committer | Alan Hourihane <alanh@tungstengraphics.com> | 2008-03-12 10:18:33 +0000 | 
| commit | b6dc381fabb199e70dc681e44e31452af8536313 (patch) | |
| tree | 9b25b1a427cba3d3e35d4272e53a482038142242 /shared-core/nouveau_mem.c | |
| parent | 7f04dd06e6003dd492ae5ddc876121a686f49157 (diff) | |
| parent | 2a618e5a7f6d26fe85e7d931d0ef08d9f18b1b7c (diff) | |
Merge branch 'master' of git+ssh://git.freedesktop.org/git/mesa/drm into modesetting-101
Conflicts:
	shared-core/i915_dma.c
	shared-core/i915_drv.h
	shared-core/i915_irq.c
Diffstat (limited to 'shared-core/nouveau_mem.c')
| -rw-r--r-- | shared-core/nouveau_mem.c | 28 | 
1 files changed, 28 insertions, 0 deletions
| diff --git a/shared-core/nouveau_mem.c b/shared-core/nouveau_mem.c index 80b2990d..4e80ca46 100644 --- a/shared-core/nouveau_mem.c +++ b/shared-core/nouveau_mem.c @@ -300,6 +300,32 @@ uint64_t nouveau_mem_fb_amount(struct drm_device *dev)  	return 0;  } +static void nouveau_mem_reset_agp(struct drm_device *dev) +{ +	struct drm_nouveau_private *dev_priv = dev->dev_private; +	uint32_t saved_pci_nv_1, saved_pci_nv_19, pmc_enable; + +	saved_pci_nv_1 = NV_READ(NV04_PBUS_PCI_NV_1); +	saved_pci_nv_19 = NV_READ(NV04_PBUS_PCI_NV_19); + +	/* clear busmaster bit */ +	NV_WRITE(NV04_PBUS_PCI_NV_1, saved_pci_nv_1 & ~0x4); +	/* clear SBA and AGP bits */ +	NV_WRITE(NV04_PBUS_PCI_NV_19, saved_pci_nv_19 & 0xfffff0ff); + +	/* power cycle pgraph, if enabled */ +	pmc_enable = NV_READ(NV03_PMC_ENABLE); +	if (pmc_enable & NV_PMC_ENABLE_PGRAPH) { +		NV_WRITE(NV03_PMC_ENABLE, pmc_enable & ~NV_PMC_ENABLE_PGRAPH); +		NV_WRITE(NV03_PMC_ENABLE, NV_READ(NV03_PMC_ENABLE) | +				NV_PMC_ENABLE_PGRAPH); +	} + +	/* and restore (gives effect of resetting AGP) */ +	NV_WRITE(NV04_PBUS_PCI_NV_19, saved_pci_nv_19); +	NV_WRITE(NV04_PBUS_PCI_NV_1, saved_pci_nv_1); +} +  static int  nouveau_mem_init_agp(struct drm_device *dev, int ttm)  { @@ -308,6 +334,8 @@ nouveau_mem_init_agp(struct drm_device *dev, int ttm)  	struct drm_agp_mode mode;  	int ret; +	nouveau_mem_reset_agp(dev); +  	ret = drm_agp_acquire(dev);  	if (ret) {  		DRM_ERROR("Unable to acquire AGP: %d\n", ret); | 
