mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-01-06 07:20:17 +01:00
i915: Initialize HWB and HWZ ring buffers in HWZ init sub-ioctl.
This commit is contained in:
parent
85ac18ae4d
commit
fc34e6bf18
3 changed files with 58 additions and 19 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue