i915: Initialize HWB and HWZ ring buffers in HWZ init sub-ioctl.

This commit is contained in:
Michel Dänzer 2007-04-05 13:03:31 +02:00
parent 85ac18ae4d
commit fc34e6bf18
3 changed files with 58 additions and 19 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;