drm/radeon/kms: implement bo busy check + current domain
[safe/jmp/linux-2.6] / drivers / gpu / drm / radeon / radeon_state.c
index ef940a0..46645f3 100644 (file)
@@ -1556,9 +1556,15 @@ static void radeon_cp_discard_buffer(struct drm_device *dev, struct drm_master *
        buf_priv->age = ++master_priv->sarea_priv->last_dispatch;
 
        /* Emit the vertex buffer age */
-       BEGIN_RING(2);
-       RADEON_DISPATCH_AGE(buf_priv->age);
-       ADVANCE_RING();
+       if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
+               BEGIN_RING(3);
+               R600_DISPATCH_AGE(buf_priv->age);
+               ADVANCE_RING();
+       } else {
+               BEGIN_RING(2);
+               RADEON_DISPATCH_AGE(buf_priv->age);
+               ADVANCE_RING();
+       }
 
        buf->pending = 1;
        buf->used = 0;
@@ -1980,7 +1986,7 @@ static int alloc_surface(drm_radeon_surface_alloc_t *new,
 
        /* find a virtual surface */
        for (i = 0; i < 2 * RADEON_MAX_SURFACES; i++)
-               if (dev_priv->virt_surfaces[i].file_priv == 0)
+               if (dev_priv->virt_surfaces[i].file_priv == NULL)
                        break;
        if (i == 2 * RADEON_MAX_SURFACES) {
                return -1;
@@ -2473,24 +2479,25 @@ static int radeon_cp_indirect(struct drm_device *dev, void *data, struct drm_fil
 
        buf->used = indirect->end;
 
-       /* Wait for the 3D stream to idle before the indirect buffer
-        * containing 2D acceleration commands is processed.
-        */
-       BEGIN_RING(2);
-
-       RADEON_WAIT_UNTIL_3D_IDLE();
-
-       ADVANCE_RING();
-
        /* Dispatch the indirect buffer full of commands from the
         * X server.  This is insecure and is thus only available to
         * privileged clients.
         */
-       radeon_cp_dispatch_indirect(dev, buf, indirect->start, indirect->end);
-       if (indirect->discard) {
-               radeon_cp_discard_buffer(dev, file_priv->master, buf);
+       if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
+               r600_cp_dispatch_indirect(dev, buf, indirect->start, indirect->end);
+       else {
+               /* Wait for the 3D stream to idle before the indirect buffer
+                * containing 2D acceleration commands is processed.
+                */
+               BEGIN_RING(2);
+               RADEON_WAIT_UNTIL_3D_IDLE();
+               ADVANCE_RING();
+               radeon_cp_dispatch_indirect(dev, buf, indirect->start, indirect->end);
        }
 
+       if (indirect->discard)
+               radeon_cp_discard_buffer(dev, file_priv->master, buf);
+
        COMMIT_RING();
        return 0;
 }
@@ -2859,12 +2866,12 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file
         */
        orig_bufsz = cmdbuf->bufsz;
        if (orig_bufsz != 0) {
-               kbuf = drm_alloc(cmdbuf->bufsz, DRM_MEM_DRIVER);
+               kbuf = kmalloc(cmdbuf->bufsz, GFP_KERNEL);
                if (kbuf == NULL)
                        return -ENOMEM;
                if (DRM_COPY_FROM_USER(kbuf, (void __user *)cmdbuf->buf,
                                       cmdbuf->bufsz)) {
-                       drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER);
+                       kfree(kbuf);
                        return -EFAULT;
                }
                cmdbuf->buf = kbuf;
@@ -2877,7 +2884,7 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file
                temp = r300_do_cp_cmdbuf(dev, file_priv, cmdbuf);
 
                if (orig_bufsz != 0)
-                       drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER);
+                       kfree(kbuf);
 
                return temp;
        }
@@ -2984,7 +2991,7 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file
        }
 
        if (orig_bufsz != 0)
-               drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER);
+               kfree(kbuf);
 
        DRM_DEBUG("DONE\n");
        COMMIT_RING();
@@ -2992,7 +2999,7 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file
 
       err:
        if (orig_bufsz != 0)
-               drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER);
+               kfree(kbuf);
        return -EINVAL;
 }
 
@@ -3010,14 +3017,14 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
                break;
        case RADEON_PARAM_LAST_FRAME:
                dev_priv->stats.last_frame_reads++;
-               value = GET_SCRATCH(0);
+               value = GET_SCRATCH(dev_priv, 0);
                break;
        case RADEON_PARAM_LAST_DISPATCH:
-               value = GET_SCRATCH(1);
+               value = GET_SCRATCH(dev_priv, 1);
                break;
        case RADEON_PARAM_LAST_CLEAR:
                dev_priv->stats.last_clear_reads++;
-               value = GET_SCRATCH(2);
+               value = GET_SCRATCH(dev_priv, 2);
                break;
        case RADEON_PARAM_IRQ_NR:
                value = drm_dev_to_irq(dev);
@@ -3052,7 +3059,10 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
        case RADEON_PARAM_SCRATCH_OFFSET:
                if (!dev_priv->writeback_works)
                        return -EINVAL;
-               value = RADEON_SCRATCH_REG_OFFSET;
+               if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
+                       value = R600_SCRATCH_REG_OFFSET;
+               else
+                       value = RADEON_SCRATCH_REG_OFFSET;
                break;
        case RADEON_PARAM_CARD_TYPE:
                if (dev_priv->flags & RADEON_IS_PCIE)
@@ -3155,6 +3165,7 @@ void radeon_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
 
 void radeon_driver_lastclose(struct drm_device *dev)
 {
+       radeon_surfaces_release(PCIGART_FILE_PRIV, dev->dev_private);
        radeon_do_release(dev);
 }
 
@@ -3164,9 +3175,7 @@ int radeon_driver_open(struct drm_device *dev, struct drm_file *file_priv)
        struct drm_radeon_driver_file_fields *radeon_priv;
 
        DRM_DEBUG("\n");
-       radeon_priv =
-           (struct drm_radeon_driver_file_fields *)
-           drm_alloc(sizeof(*radeon_priv), DRM_MEM_FILES);
+       radeon_priv = kmalloc(sizeof(*radeon_priv), GFP_KERNEL);
 
        if (!radeon_priv)
                return -ENOMEM;
@@ -3185,7 +3194,7 @@ void radeon_driver_postclose(struct drm_device *dev, struct drm_file *file_priv)
        struct drm_radeon_driver_file_fields *radeon_priv =
            file_priv->driver_priv;
 
-       drm_free(radeon_priv, sizeof(*radeon_priv), DRM_MEM_FILES);
+       kfree(radeon_priv);
 }
 
 struct drm_ioctl_desc radeon_ioctls[] = {