diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 6aaacd22..195d90df 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -99,6 +99,12 @@ static int i915_dma_cleanup(drm_device_t * dev) if (dev_priv->ring.virtual_start) { drm_core_ioremapfree(&dev_priv->ring.map, dev); } + if (dev_priv->hwb_ring.virtual_start) { + drm_core_ioremapfree(&dev_priv->hwb_ring.map, dev); + } + if (dev_priv->hwz_ring.virtual_start) { + drm_core_ioremapfree(&dev_priv->hwz_ring.map, dev); + } if (dev_priv->status_page_dmah) { drm_pci_free(dev, dev_priv->status_page_dmah); @@ -115,6 +121,33 @@ static int i915_dma_cleanup(drm_device_t * dev) return 0; } +static int i915_init_ring(drm_device_t * dev, drm_i915_ring_buffer_t * ring, + unsigned start, unsigned end, unsigned size, u32 reg) +{ + ring->Start = start; + ring->End = end; + ring->Size = size; + ring->tail_mask = ring->Size - 1; + + ring->map.offset = start; + ring->map.size = size; + ring->map.type = 0; + ring->map.flags = 0; + ring->map.mtrr = 0; + + drm_core_ioremap(&ring->map, dev); + + if (ring->map.handle == NULL) { + DRM_ERROR("can not ioremap virtual address for ring buffer\n"); + return DRM_ERR(ENOMEM); + } + + ring->virtual_start = ring->map.handle; + ring->reg = reg; + + return 0; +} + static int i915_initialize(drm_device_t * dev, drm_i915_private_t * dev_priv, drm_i915_init_t * init) @@ -140,30 +173,14 @@ static int i915_initialize(drm_device_t * dev, dev_priv->sarea_priv = (drm_i915_sarea_t *) ((u8 *) dev_priv->sarea->handle + init->sarea_priv_offset); - dev_priv->ring.Start = init->ring_start; - dev_priv->ring.End = init->ring_end; - dev_priv->ring.Size = init->ring_size; - dev_priv->ring.tail_mask = dev_priv->ring.Size - 1; - - dev_priv->ring.map.offset = init->ring_start; - dev_priv->ring.map.size = init->ring_size; - dev_priv->ring.map.type = 0; - dev_priv->ring.map.flags = 0; - dev_priv->ring.map.mtrr = 0; - - drm_core_ioremap(&dev_priv->ring.map, dev); - - if (dev_priv->ring.map.handle == NULL) { + if (i915_init_ring(dev, &dev_priv->ring, init->ring_start, + init->ring_end, init->ring_size, LP_RING)) { dev->dev_private = (void *)dev_priv; i915_dma_cleanup(dev); - DRM_ERROR("can not ioremap virtual address for" - " ring buffer\n"); + DRM_ERROR("Failed to initialize LP ring buffer\n"); return DRM_ERR(ENOMEM); } - dev_priv->ring.virtual_start = dev_priv->ring.map.handle; - dev_priv->ring.reg = LP_RING; - dev_priv->cpp = init->cpp; dev_priv->sarea_priv->pf_current_page = 0; @@ -1002,6 +1019,18 @@ static int i915_hwz_init(drm_device_t *dev, drm_i915_hwz_t *hwz) return DRM_ERR(ENOMEM); } + if (i915_init_ring(dev, &dev_priv->hwb_ring, hwz->init.hwb_start, + hwz->init.hwb_end, hwz->init.hwb_size, HWB_RING)) { + DRM_ERROR("Failed to initialize HWB ring buffer\n"); + return DRM_ERR(ENOMEM); + } + + if (i915_init_ring(dev, &dev_priv->hwz_ring, hwz->init.hwz_start, + hwz->init.hwz_end, hwz->init.hwz_size, HP_RING)) { + DRM_ERROR("Failed to initialize HWZ ring buffer\n"); + return DRM_ERR(ENOMEM); + } + DRM_INFO("HWZ initialized\n"); return 0; diff --git a/shared-core/i915_drm.h b/shared-core/i915_drm.h index 03524383..2bc41902 100644 --- a/shared-core/i915_drm.h +++ b/shared-core/i915_drm.h @@ -326,6 +326,14 @@ typedef struct drm_i915_mmio { typedef struct drm_i915_hwz { unsigned int op; union { + struct { + unsigned int hwb_start; + unsigned int hwb_end; + unsigned int hwb_size; + unsigned int hwz_start; + unsigned int hwz_end; + unsigned int hwz_size; + } init; struct { unsigned int num_buffers; unsigned short x1; diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h index 39a93d99..3ea639dc 100644 --- a/shared-core/i915_drv.h +++ b/shared-core/i915_drv.h @@ -96,6 +96,8 @@ typedef struct drm_i915_private { drm_i915_sarea_t *sarea_priv; drm_i915_ring_buffer_t ring; + drm_i915_ring_buffer_t hwb_ring; + drm_i915_ring_buffer_t hwz_ring; drm_dma_handle_t *status_page_dmah; void *hw_status_page;