diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index bb3f380c..c9824204 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -762,6 +762,8 @@ static int i915_bmp_alloc(drm_device_t *dev) ((BMP_SIZE / PAGE_SIZE - 1) << BMP_BUFFER_SIZE_SHIFT) | BMP_ENABLE); + DRM_INFO("BMP allocated and initialized\n"); + return 0; } @@ -788,6 +790,8 @@ static void i915_bmp_free(drm_device_t *dev) drm_pci_free(dev, dev_priv->bmp); dev_priv->bmp = NULL; } + + DRM_INFO("BMP freed\n"); } static int i915_bpl_alloc(drm_device_t *dev, drm_i915_hwz_t *hwz, @@ -888,6 +892,11 @@ static int i915_hwz_alloc(drm_device_t *dev, drm_i915_hwz_t *hwz) (hwz->y1 & BIN_HMASK); int bins_per_row = hwz->pitch / BIN_WIDTH; + if (!dev_priv->bmp) { + DRM_DEBUG("HWZ not initialized\n"); + return DRM_ERR(EINVAL); + } + if (hwz->num_buffers > 3) { DRM_ERROR("Only up to 3 buffers allowed\n"); return DRM_ERR(EINVAL); @@ -898,11 +907,6 @@ static int i915_hwz_alloc(drm_device_t *dev, drm_i915_hwz_t *hwz) return DRM_ERR(EINVAL); } - if (!dev_priv->bmp && i915_bmp_alloc(dev)) { - DRM_ERROR("Failed to allocate BMP\n"); - return DRM_ERR(ENOMEM); - } - if (i915_bpl_alloc(dev, hwz, bins_per_row, bin_rows)) { DRM_ERROR("Failed to allocate BPLs\n"); return DRM_ERR(ENOMEM); @@ -930,15 +934,45 @@ static int i915_hwz_render(drm_device_t *dev, drm_i915_hwz_t *hwz) return 0; } +static int i915_hwz_init(drm_device_t *dev, drm_i915_hwz_t *hwz) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + + if (dev_priv->bmp) { + DRM_DEBUG("Already initialized\n"); + return DRM_ERR(EBUSY); + } + + if (i915_bmp_alloc(dev)) { + DRM_ERROR("Failed to allocate BMP\n"); + return DRM_ERR(ENOMEM); + } + + DRM_INFO("HWZ initialized\n"); + + return 0; +} + static int i915_hwz(DRM_IOCTL_ARGS) { DRM_DEVICE; drm_i915_hwz_t hwz; + if (!dev->dev_private) { + DRM_ERROR("called with no initialization\n"); + return DRM_ERR(EINVAL); + } + DRM_COPY_FROM_USER_IOCTL(hwz, (drm_i915_hwz_t __user *) data, sizeof(hwz)); switch (hwz.op) { + case DRM_I915_HWZ_INIT: + if (!priv->master) { + DRM_ERROR("Only master may initialize HWZ\n"); + return DRM_ERR(EINVAL); + } + return i915_hwz_init(dev, &hwz); case DRM_I915_HWZ_RENDER: DRM_INFO("i915 hwz render\n" /*, batch.start, batch.used, batch.num_cliprects*/); diff --git a/shared-core/i915_drm.h b/shared-core/i915_drm.h index b99ab9ca..24531fc9 100644 --- a/shared-core/i915_drm.h +++ b/shared-core/i915_drm.h @@ -318,9 +318,10 @@ typedef struct drm_i915_mmio { /* Hardware Zone Rendering Support: */ -#define DRM_I915_HWZ_RENDER 1 +#define DRM_I915_HWZ_INIT 1 #define DRM_I915_HWZ_ALLOC 2 -#define DRM_I915_HWZ_FREE 3 +#define DRM_I915_HWZ_RENDER 3 +#define DRM_I915_HWZ_FREE 4 typedef struct drm_i915_hwz { unsigned int op;