summaryrefslogtreecommitdiff
path: root/shared-core/i915_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'shared-core/i915_init.c')
-rw-r--r--shared-core/i915_init.c58
1 files changed, 40 insertions, 18 deletions
diff --git a/shared-core/i915_init.c b/shared-core/i915_init.c
index 792c40bb..c2d8964e 100644
--- a/shared-core/i915_init.c
+++ b/shared-core/i915_init.c
@@ -113,7 +113,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
{
struct drm_i915_private *dev_priv;
unsigned long agp_size, prealloc_size;
- unsigned long sareapage;
int size, ret;
dev_priv = drm_alloc(sizeof(struct drm_i915_private), DRM_MEM_DRIVER);
@@ -160,20 +159,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
return ret;
}
- /* prebuild the SAREA */
- sareapage = max(SAREA_MAX, PAGE_SIZE);
- ret = drm_addmap(dev, 0, sareapage, _DRM_SHM, _DRM_CONTAINS_LOCK|_DRM_DRIVER,
- &dev_priv->sarea);
- if (ret) {
- DRM_ERROR("SAREA setup failed\n");
- return ret;
- }
-
- init_waitqueue_head(&dev->lock.lock_queue);
-
- /* FIXME: assume sarea_priv is right after SAREA */
- dev_priv->sarea_priv = dev_priv->sarea->handle + sizeof(struct drm_sarea);
-
/*
* Initialize the memory manager for local and AGP space
*/
@@ -216,7 +201,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
DRM_DEBUG("ring start %08lX, %p, %08lX\n", dev_priv->ring.Start,
dev_priv->ring.virtual_start, dev_priv->ring.Size);
- dev_priv->sarea_priv->pf_current_page = 0;
+ //
memset((void *)(dev_priv->ring.virtual_start), 0, dev_priv->ring.Size);
@@ -319,12 +304,49 @@ int i915_driver_unload(struct drm_device *dev)
drm_bo_driver_finish(dev);
- DRM_DEBUG("%p, %p\n", dev_priv->mmio_map, dev_priv->sarea);
+ DRM_DEBUG("%p\n", dev_priv->mmio_map);
drm_rmmap(dev, dev_priv->mmio_map);
- drm_rmmap(dev, dev_priv->sarea);
drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
dev->dev_private = NULL;
return 0;
}
+
+int i915_master_create(struct drm_device *dev, struct drm_master *master)
+{
+ struct drm_i915_master_private *master_priv;
+ unsigned long sareapage;
+ int ret;
+
+ master_priv = drm_calloc(1, sizeof(*master_priv), DRM_MEM_DRIVER);
+ if (!master_priv)
+ return -ENOMEM;
+
+ /* prebuild the SAREA */
+ sareapage = max(SAREA_MAX, PAGE_SIZE);
+ ret = drm_addmap(dev, 0, sareapage, _DRM_SHM, _DRM_CONTAINS_LOCK|_DRM_DRIVER,
+ &master_priv->sarea);
+ if (ret) {
+ DRM_ERROR("SAREA setup failed\n");
+ return ret;
+ }
+ master_priv->sarea_priv = master_priv->sarea->handle + sizeof(struct drm_sarea);
+ master_priv->sarea_priv->pf_current_page = 0;
+
+ master->driver_priv = master_priv;
+ return 0;
+}
+
+void i915_master_destroy(struct drm_device *dev, struct drm_master *master)
+{
+ struct drm_i915_master_private *master_priv = master->driver_priv;
+
+ if (!master_priv)
+ return;
+
+ drm_rmmap(dev, master_priv->sarea);
+ drm_free(master_priv, sizeof(*master_priv), DRM_MEM_DRIVER);
+
+ master->driver_priv = NULL;
+}