missing bits
authorDave Airlie <airlied@redhat.com>
Wed, 13 Feb 2008 21:37:34 +0000 (07:37 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 13 Feb 2008 21:37:34 +0000 (07:37 +1000)
shared-core/i915_dma.c
shared-core/i915_drv.h
shared-core/i915_init.c
shared-core/i915_irq.c
shared-core/i915_mem.c
shared-core/radeon_state.c

index 68505dc..0a3d82a 100644 (file)
@@ -88,14 +88,7 @@ int i915_dma_cleanup(struct drm_device * dev)
 static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-
-       dev_priv->sarea = drm_getsarea(dev);
-       if (!dev_priv->sarea) {
-               DRM_ERROR("can not find sarea!\n");
-               i915_dma_cleanup(dev);
-               return -EINVAL;
-       }
-
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
        dev_priv->mmio_map = drm_core_findmap(dev, init->mmio_offset);
        if (!dev_priv->mmio_map) {
                i915_dma_cleanup(dev);
@@ -107,9 +100,6 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
        dev_priv->max_validate_buffers = I915_MAX_VALIDATE_BUFFERS;
 #endif
 
-       dev_priv->sarea_priv = (drm_i915_sarea_t *)
-           ((u8 *) dev_priv->sarea->handle + init->sarea_priv_offset);
-
        if (!dev_priv->ring.Size) {
                dev_priv->ring.Start = init->ring_start;
                dev_priv->ring.End = init->ring_end;
@@ -135,7 +125,7 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
 
 
        dev_priv->cpp = init->cpp;
-       dev_priv->sarea_priv->pf_current_page = 0;
+       master_priv->sarea_priv->pf_current_page = 0;
 
        /* We are using separate values as placeholders for mechanisms for
         * private backbuffer/depthbuffer usage.
@@ -182,11 +172,6 @@ static int i915_dma_resume(struct drm_device * dev)
 
        DRM_DEBUG("\n");
 
-       if (!dev_priv->sarea) {
-               DRM_ERROR("can not find sarea!\n");
-               return -EINVAL;
-       }
-
        if (!dev_priv->mmio_map) {
                DRM_ERROR("can not find mmio map!\n");
                return -EINVAL;
@@ -400,6 +385,7 @@ static int i915_emit_box(struct drm_device * dev,
 void i915_emit_breadcrumb(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
        RING_LOCALS;
 
        if (++dev_priv->counter > BREADCRUMB_MASK) {
@@ -407,7 +393,7 @@ void i915_emit_breadcrumb(struct drm_device *dev)
                 DRM_DEBUG("Breadcrumb counter wrapped around\n");
        }
 
-       dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
+       master_priv->sarea_priv->last_enqueue = dev_priv->counter;
 
        BEGIN_LP_RING(4);
        OUT_RING(CMD_STORE_DWORD_IDX);
@@ -534,37 +520,38 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev,
 static void i915_do_dispatch_flip(struct drm_device * dev, int plane, int sync)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
        u32 num_pages, current_page, next_page, dspbase;
        int shift = 2 * plane, x, y;
        RING_LOCALS;
 
        /* Calculate display base offset */
-       num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2;
-       current_page = (dev_priv->sarea_priv->pf_current_page >> shift) & 0x3;
+       num_pages = master_priv->sarea_priv->third_handle ? 3 : 2;
+       current_page = (master_priv->sarea_priv->pf_current_page >> shift) & 0x3;
        next_page = (current_page + 1) % num_pages;
 
        switch (next_page) {
        default:
        case 0:
-               dspbase = dev_priv->sarea_priv->front_offset;
+               dspbase = master_priv->sarea_priv->front_offset;
                break;
        case 1:
-               dspbase = dev_priv->sarea_priv->back_offset;
+               dspbase = master_priv->sarea_priv->back_offset;
                break;
        case 2:
-               dspbase = dev_priv->sarea_priv->third_offset;
+               dspbase = master_priv->sarea_priv->third_offset;
                break;
        }
 
        if (plane == 0) {
-               x = dev_priv->sarea_priv->planeA_x;
-               y = dev_priv->sarea_priv->planeA_y;
+               x = master_priv->sarea_priv->planeA_x;
+               y = master_priv->sarea_priv->planeA_y;
        } else {
-               x = dev_priv->sarea_priv->planeB_x;
-               y = dev_priv->sarea_priv->planeB_y;
+               x = master_priv->sarea_priv->planeB_x;
+               y = master_priv->sarea_priv->planeB_y;
        }
 
-       dspbase += (y * dev_priv->sarea_priv->pitch + x) * dev_priv->cpp;
+       dspbase += (y * master_priv->sarea_priv->pitch + x) * dev_priv->cpp;
 
        DRM_DEBUG("plane=%d current_page=%d dspbase=0x%x\n", plane, current_page,
                  dspbase);
@@ -575,21 +562,22 @@ static void i915_do_dispatch_flip(struct drm_device * dev, int plane, int sync)
                                       MI_WAIT_FOR_PLANE_A_FLIP)));
        OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | (sync ? 0 : ASYNC_FLIP) |
                 (plane ? DISPLAY_PLANE_B : DISPLAY_PLANE_A));
-       OUT_RING(dev_priv->sarea_priv->pitch * dev_priv->cpp);
+       OUT_RING(master_priv->sarea_priv->pitch * dev_priv->cpp);
        OUT_RING(dspbase);
        ADVANCE_LP_RING();
 
-       dev_priv->sarea_priv->pf_current_page &= ~(0x3 << shift);
-       dev_priv->sarea_priv->pf_current_page |= next_page << shift;
+       master_priv->sarea_priv->pf_current_page &= ~(0x3 << shift);
+       master_priv->sarea_priv->pf_current_page |= next_page << shift;
 }
 
 void i915_dispatch_flip(struct drm_device * dev, int planes, int sync)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
        int i;
 
        DRM_DEBUG("planes=0x%x pfCurrentPage=%d\n",
-                 planes, dev_priv->sarea_priv->pf_current_page);
+                 planes, master_priv->sarea_priv->pf_current_page);
 
        i915_emit_mi_flush(dev, MI_READ_FLUSH | MI_EXE_FLUSH);
 
@@ -625,8 +613,9 @@ static int i915_batchbuffer(struct drm_device *dev, void *data,
                            struct drm_file *file_priv)
 {
        struct drm_i915_private *dev_priv = (struct drm_i915_private *) dev->dev_private;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
        drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
-           dev_priv->sarea_priv;
+           master_priv->sarea_priv;
        drm_i915_batchbuffer_t *batch = data;
        int ret;
 
@@ -655,8 +644,9 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,
                          struct drm_file *file_priv)
 {
        struct drm_i915_private *dev_priv = (struct drm_i915_private *) dev->dev_private;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
        struct drm_i915_sarea *sarea_priv = (struct drm_i915_sarea *)
-           dev_priv->sarea_priv;
+               master_priv->sarea_priv;
        struct drm_i915_cmdbuffer *cmdbuf = data;
        int ret;
 
@@ -1011,8 +1001,9 @@ static int i915_execbuffer(struct drm_device *dev, void *data,
                           struct drm_file *file_priv)
 {
        struct drm_i915_private *dev_priv = (struct drm_i915_private *) dev->dev_private;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
        drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
-               dev_priv->sarea_priv;
+               master_priv->sarea_priv;
        struct drm_i915_execbuffer *exec_buf = data;
        struct drm_i915_batchbuffer *batch = &exec_buf->batch;
        struct drm_fence_arg *fence_arg = &exec_buf->fence_arg;
@@ -1116,15 +1107,15 @@ out_free:
 
 int i915_do_cleanup_pageflip(struct drm_device * dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
        int i, planes, num_pages;
 
        DRM_DEBUG("\n");
-       num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2;
+       num_pages = master_priv->sarea_priv->third_handle ? 3 : 2;
        for (i = 0, planes = 0; i < 2; i++) {
-               if (dev_priv->sarea_priv->pf_current_page & (0x3 << (2 * i))) {
-                       dev_priv->sarea_priv->pf_current_page =
-                               (dev_priv->sarea_priv->pf_current_page &
+               if (master_priv->sarea_priv->pf_current_page & (0x3 << (2 * i))) {
+                       master_priv->sarea_priv->pf_current_page =
+                               (master_priv->sarea_priv->pf_current_page &
                                 ~(0x3 << (2 * i))) | ((num_pages - 1) << (2 * i));
 
                        planes |= 1 << i;
index ea89bc4..19fec0f 100644 (file)
@@ -97,17 +97,22 @@ struct drm_i915_vbl_swap {
        unsigned int plane;
        unsigned int sequence;
        int flip;
+       struct drm_minor *minor;
 };
 
+struct drm_i915_master_private {
+       drm_local_map_t *sarea;
+       struct drm_i915_sarea *sarea_priv;
+};
+       
 struct drm_i915_private {
        struct drm_buffer_object *ring_buffer;
-       drm_local_map_t *sarea;
+
        drm_local_map_t *mmio_map;
 
        unsigned long mmiobase;
        unsigned long mmiolen;
 
-       struct drm_i915_sarea *sarea_priv;
        struct drm_i915_ring_buffer ring;
 
        struct drm_dma_handle *status_page_dmah;
@@ -249,6 +254,8 @@ enum intel_chip_family {
 extern struct drm_ioctl_desc i915_ioctls[];
 extern int i915_max_ioctl;
 
+extern int i915_master_create(struct drm_device *dev, struct drm_master *master);
+extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master);
                                /* i915_dma.c */
 extern void i915_kernel_lost_context(struct drm_device * dev);
 extern int i915_driver_load(struct drm_device *, unsigned long flags);
index 792c40b..c2d8964 100644 (file)
@@ -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;
+}
index 5f6fa56..dad6ef8 100644 (file)
@@ -107,8 +107,8 @@ static void
 i915_dispatch_vsync_flip(struct drm_device *dev, struct drm_drawable_info *drw,
                         int plane)
 {
-       struct drm_i915_private *dev_priv = (struct drm_i915_private *) dev->dev_private;
-       struct drm_i915_sarea *sarea_priv = dev_priv->sarea_priv;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
+       struct drm_i915_sarea *sarea_priv = master_priv->sarea_priv;
        u16 x1, y1, x2, y2;
        int pf_planes = 1 << plane;
 
@@ -153,18 +153,18 @@ i915_dispatch_vsync_flip(struct drm_device *dev, struct drm_drawable_info *drw,
 static void i915_vblank_tasklet(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = (struct drm_i915_private *) dev->dev_private;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
        struct list_head *list, *tmp, hits, *hit;
        int nhits, nrects, slice[2], upper[2], lower[2], i, num_pages;
        unsigned counter[2];
        struct drm_drawable_info *drw;
-       struct drm_i915_sarea *sarea_priv = dev_priv->sarea_priv;
+       struct drm_i915_sarea *sarea_priv;
        u32 cpp = dev_priv->cpp,  offsets[3];
        u32 cmd = (cpp == 4) ? (XY_SRC_COPY_BLT_CMD |
                                XY_SRC_COPY_BLT_WRITE_ALPHA |
                                XY_SRC_COPY_BLT_WRITE_RGB)
                             : XY_SRC_COPY_BLT_CMD;
-       u32 pitchropcpp = (sarea_priv->pitch * cpp) | (0xcc << 16) |
-                         (cpp << 23) | (1 << 24);
+       u32 pitchropcpp;
        RING_LOCALS;
 
        counter[0] = drm_vblank_count(dev, 0);
@@ -192,6 +192,12 @@ static void i915_vblank_tasklet(struct drm_device *dev)
                if ((counter[pipe] - vbl_swap->sequence) > (1<<23))
                        continue;
 
+               master_priv = vbl_swap->minor->master->driver_priv;
+               sarea_priv = master_priv->sarea_priv;
+               
+               pitchropcpp = (sarea_priv->pitch * cpp) | (0xcc << 16) |
+                       (cpp << 23) | (1 << 24);
+
                list_del(list);
                dev_priv->swaps_pending--;
                drm_vblank_put(dev, pipe);
@@ -306,7 +312,7 @@ static void i915_vblank_tasklet(struct drm_device *dev)
                        top = upper[plane];
                        bottom = lower[plane];
 
-                       front = (dev_priv->sarea_priv->pf_current_page >>
+                       front = (master_priv->sarea_priv->pf_current_page >>
                                 (2 * plane)) & 0x3;
                        back = (front + 1) % num_pages;
 
@@ -559,6 +565,7 @@ static int i915_run_hotplug_tasklet(struct drm_device *dev, uint32_t stat)
 irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
 {
        struct drm_device *dev = (struct drm_device *) arg;
+       struct drm_i915_master_private *master_priv;
        struct drm_i915_private *dev_priv = (struct drm_i915_private *) dev->dev_private;
        u32 temp = 0;
        u32 temp2;
@@ -627,7 +634,10 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
        temp &= (dev_priv->irq_enable_reg | USER_INT_FLAG | VSYNC_PIPEA_FLAG |
                 VSYNC_PIPEB_FLAG);
 
-       dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
+       if (dev->primary->master) {
+               master_priv = dev->primary->master->driver_priv;
+               master_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
+       }
 
        if (temp & USER_INT_FLAG) {
                DRM_WAKEUP(&dev_priv->irq_queue);
@@ -699,6 +709,7 @@ void i915_user_irq_off(struct drm_i915_private *dev_priv)
 static int i915_wait_irq(struct drm_device * dev, int irq_nr)
 {
        struct drm_i915_private *dev_priv = (struct drm_i915_private *) dev->dev_private;
+       struct drm_i915_master_private *master_priv;
        int ret = 0;
 
        DRM_DEBUG("irq_nr=%d breadcrumb=%d\n", irq_nr,
@@ -716,8 +727,12 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
                DRM_ERROR("EBUSY -- rec: %d emitted: %d\n",
                          READ_BREADCRUMB(dev_priv), (int)dev_priv->counter);
        }
+       
+       if (dev->primary->master) {
+               master_priv = dev->primary->master->driver_priv;
+               master_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
+       }
 
-       dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
        return ret;
 }
 
@@ -904,6 +919,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
                     struct drm_file *file_priv)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_master_private *master_priv;
        struct drm_i915_vblank_swap *swap = data;
        struct drm_i915_vbl_swap *vbl_swap;
        unsigned int pipe, seqtype, curseq, plane;
@@ -916,7 +932,12 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
                return -EINVAL;
        }
 
-       if (dev_priv->sarea_priv->rotation) {
+       if (!dev->primary->master)
+               return -EINVAL;
+
+       master_priv = dev->primary->master->driver_priv;
+
+       if (master_priv->sarea_priv->rotation) {
                DRM_DEBUG("Rotation not supported\n");
                return -EINVAL;
        }
@@ -1037,6 +1058,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
        vbl_swap->plane = plane;
        vbl_swap->sequence = swap->sequence;
        vbl_swap->flip = (swap->seqtype & _DRM_VBLANK_FLIP);
+       vbl_swap->minor = file_priv->minor;
 
        if (vbl_swap->flip)
                swap->sequence++;
index f24547c..15d63de 100644 (file)
@@ -46,7 +46,8 @@
 static void mark_block(struct drm_device * dev, struct mem_block *p, int in_use)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_i915_sarea *sarea_priv = dev_priv->sarea_priv;
+       struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
+       struct drm_i915_sarea *sarea_priv = master_priv->sarea_priv;
        struct drm_tex_region *list;
        unsigned shift, nr;
        unsigned start;
index 6f2e05b..289fddc 100644 (file)
@@ -3057,7 +3057,7 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
                 */
        case RADEON_PARAM_SAREA_HANDLE:
                /* The lock is the first dword in the sarea. */
-               value = (long)dev->lock.hw_lock;
+               value = (long)dev->primary->master->lock.hw_lock;
                break;
 #endif
        case RADEON_PARAM_GART_TEX_HANDLE: