diff options
author | rnoland <rnoland@FreeBSD.org> | 2010-04-22 18:21:25 +0000 |
---|---|---|
committer | rnoland <rnoland@FreeBSD.org> | 2010-04-22 18:21:25 +0000 |
commit | b733ebaa1ccc608f662359519c4712cf384b1360 (patch) | |
tree | 4cbae1e0936ed160e9fca32b44038b3450bb6072 /sys/dev/drm/i915_dma.c | |
parent | c0d6a78ddcc9bdcf4f9ee2858efab1abf0db5bdf (diff) | |
download | FreeBSD-src-b733ebaa1ccc608f662359519c4712cf384b1360.zip FreeBSD-src-b733ebaa1ccc608f662359519c4712cf384b1360.tar.gz |
Rework how drm maps are handled.
* On 32 bit platforms we steal the upper 4 bits of the map handle
to store a unique map id.
* On 64 bit platforms we steal the upper 24 bits.
Resolves issues where the offsets that are handed to mmap may overlap the VRAM on some cards.
Tested on: radeon, intel, mga, and via.
This will break nouveau. I will spin new patches shortly.
Diffstat (limited to 'sys/dev/drm/i915_dma.c')
-rw-r--r-- | sys/dev/drm/i915_dma.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/sys/dev/drm/i915_dma.c b/sys/dev/drm/i915_dma.c index 386c058..7f8ddc1 100644 --- a/sys/dev/drm/i915_dma.c +++ b/sys/dev/drm/i915_dma.c @@ -151,7 +151,7 @@ static int i915_dma_cleanup(struct drm_device * dev) if (dev_priv->ring.virtual_start) { drm_core_ioremapfree(&dev_priv->ring.map, dev); dev_priv->ring.virtual_start = NULL; - dev_priv->ring.map.handle = NULL; + dev_priv->ring.map.virtual = NULL; dev_priv->ring.map.size = 0; } @@ -174,7 +174,7 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init) } dev_priv->sarea_priv = (drm_i915_sarea_t *) - ((u8 *) dev_priv->sarea->handle + init->sarea_priv_offset); + ((u8 *) dev_priv->sarea->virtual + init->sarea_priv_offset); if (init->ring_size != 0) { if (dev_priv->ring.ring_obj != NULL) { @@ -195,7 +195,7 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init) drm_core_ioremap_wc(&dev_priv->ring.map, dev); - if (dev_priv->ring.map.handle == NULL) { + if (dev_priv->ring.map.virtual == NULL) { i915_dma_cleanup(dev); DRM_ERROR("can not ioremap virtual address for" " ring buffer\n"); @@ -203,7 +203,7 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init) } } - dev_priv->ring.virtual_start = dev_priv->ring.map.handle; + dev_priv->ring.virtual_start = dev_priv->ring.map.virtual; dev_priv->cpp = init->cpp; dev_priv->back_offset = init->back_offset; @@ -229,7 +229,7 @@ static int i915_dma_resume(struct drm_device * dev) return -EINVAL; } - if (dev_priv->ring.map.handle == NULL) { + if (dev_priv->ring.map.virtual == NULL) { DRM_ERROR("can not ioremap virtual address for" " ring buffer\n"); return -ENOMEM; @@ -823,14 +823,14 @@ static int i915_set_status_page(struct drm_device *dev, void *data, dev_priv->hws_map.mtrr = 0; drm_core_ioremap_wc(&dev_priv->hws_map, dev); - if (dev_priv->hws_map.handle == NULL) { + if (dev_priv->hws_map.virtual == NULL) { i915_dma_cleanup(dev); dev_priv->status_gfx_addr = 0; DRM_ERROR("can not ioremap virtual address for" " G33 hw status page\n"); return -ENOMEM; } - dev_priv->hw_status_page = dev_priv->hws_map.handle; + dev_priv->hw_status_page = dev_priv->hws_map.virtual; memset(dev_priv->hw_status_page, 0, PAGE_SIZE); I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr); |