diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h index eab51e3..6c2c079 100644 --- a/shared-core/i915_drv.h +++ b/shared-core/i915_drv.h @@ -116,7 +116,7 @@ struct drm_i915_master_private { struct drm_i915_private { struct drm_device *dev; - struct drm_buffer_object *ring_buffer; + struct drm_gem_object *ring_buffer; drm_local_map_t *mmio_map; @@ -131,7 +131,7 @@ struct drm_i915_private { uint32_t counter; unsigned int status_gfx_addr; drm_local_map_t hws_map; - struct drm_buffer_object *hws_bo; + struct drm_gem_object *hws_bo; unsigned int cpp; @@ -179,8 +179,7 @@ struct drm_i915_private { #if defined(I915_HAVE_BUFFER) /* DRI2 sarea */ - struct drm_buffer_object *sarea_bo; - struct drm_bo_kmap_obj sarea_kmap; + struct drm_gem_object *sarea_bo; /* Feature bits from the VBIOS */ int int_tv_support:1; @@ -427,6 +426,8 @@ extern int i915_quiescent(struct drm_device *dev); int i915_emit_box(struct drm_device * dev, struct drm_clip_rect __user * boxes, int i, int DR1, int DR4); +extern int i915_gem_do_init(struct drm_device *dev, unsigned long start, + unsigned long end) /* i915_irq.c */ extern int i915_irq_emit(struct drm_device *dev, void *data, diff --git a/shared-core/i915_init.c b/shared-core/i915_init.c index e13d12f..4b457e3 100644 --- a/shared-core/i915_init.c +++ b/shared-core/i915_init.c @@ -100,30 +100,19 @@ int i915_probe_agp(struct pci_dev *pdev, unsigned long *aperture_size, return 0; } -int i915_load_modeset_init(struct drm_device *dev) +int i915_init_ringbuffer(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev->dev_private; - unsigned long agp_size, prealloc_size; - int size, ret = 0; - - i915_probe_agp(dev->pdev, &agp_size, &prealloc_size); - printk("setting up %ld bytes of VRAM space\n", prealloc_size); - printk("setting up %ld bytes of TT space\n", (agp_size - prealloc_size)); + int ret = 0, size; - drm_bo_init_mm(dev, DRM_BO_MEM_VRAM, 0, prealloc_size >> PAGE_SHIFT, 1); - drm_bo_init_mm(dev, DRM_BO_MEM_TT, prealloc_size >> PAGE_SHIFT, - (agp_size - prealloc_size) >> PAGE_SHIFT, 1); I915_WRITE(PRB0_CTL, 0); I915_WRITE(PRB0_HEAD, 0); I915_WRITE(PRB0_TAIL, 0); size = PRIMARY_RINGBUFFER_SIZE; - ret = drm_buffer_object_create(dev, size, drm_bo_type_kernel, - DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE | - DRM_BO_FLAG_MEM_VRAM | - DRM_BO_FLAG_NO_EVICT, - DRM_BO_HINT_DONT_FENCE, 0x1, 0, - &dev_priv->ring_buffer); + + /* GEM alloc ring buffer here */ + if (ret < 0) { DRM_ERROR("Unable to allocate or pin ring buffer\n"); goto clean_mm; @@ -151,6 +140,35 @@ int i915_load_modeset_init(struct drm_device *dev) I915_WRITE(PRB0_CTL, ((dev_priv->ring.Size - 4096) & RING_NR_PAGES) | (RING_NO_REPORT | RING_VALID)); +destroy_ringbuffer: + if (dev_priv->ring.virtual_start) + drm_mem_reg_iounmap(dev, &dev_priv->ring_buffer->mem, + dev_priv->ring.virtual_start); + if (dev_priv->ring_buffer) + drm_bo_usage_deref_unlocked(&dev_priv->ring_buffer); + + return ret; +} + +int i915_load_modeset_init(struct drm_device *dev) +{ + struct drm_i915_private *dev_priv = dev->dev_private; + unsigned long agp_size, prealloc_size; + int size, ret = 0; + + i915_probe_agp(dev->pdev, &agp_size, &prealloc_size); + /* Initialize the memory manager for local and AGP space */ + ret = i915_gem_do_init(dev, prealloc_size, agp_size - prealloc_size); + if (ret) { + DRM_ERROR("fail to init memory manager for " + "local & AGP space: %d\n"); + goto out; + } + + ret = i915_init_ringbuffer(); + if (ret) + goto out; + /* Allow hardware batchbuffers unless told otherwise. */ dev_priv->allow_batchbuffer = 1; @@ -256,15 +274,10 @@ destroy_hws: drm_bo_usage_deref_unlocked(&dev_priv->hws_bo); } I915_WRITE(HWS_PGA, 0x1ffff000); -destroy_ringbuffer: - if (dev_priv->ring.virtual_start) - drm_mem_reg_iounmap(dev, &dev_priv->ring_buffer->mem, - dev_priv->ring.virtual_start); - if (dev_priv->ring_buffer) - drm_bo_usage_deref_unlocked(&dev_priv->ring_buffer); clean_mm: drm_bo_clean_mm(dev, DRM_BO_MEM_VRAM, 1); drm_bo_clean_mm(dev, DRM_BO_MEM_TT, 1); +out: return ret; } @@ -358,16 +371,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) #endif if (drm_core_check_feature(dev, DRIVER_MODESET)) { - /* - * Initialize the memory manager for local and AGP space - */ - ret = drm_bo_driver_init(dev); - if (ret) { - DRM_ERROR("fail to init memory manager for " - "local & AGP space\n"); - goto out_rmmap; - } - ret = i915_load_modeset_init(dev); if (ret < 0) { DRM_ERROR("failed to init modeset\n");