]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/char/drm/r300_cmdbuf.c
drm: remove a bunch of typedefs on the userspace interface
[karo-tx-linux.git] / drivers / char / drm / r300_cmdbuf.c
index b108c7f913b2cb75ef93924f00845bd40f1bc778..4a517cc133b711e29e58ab4869ddf803b2005d8b 100644 (file)
@@ -55,7 +55,7 @@ static const int r300_cliprect_cntl[4] = {
 static int r300_emit_cliprects(drm_radeon_private_t *dev_priv,
                               drm_radeon_kcmd_buffer_t *cmdbuf, int n)
 {
-       drm_clip_rect_t box;
+       struct drm_clip_rect box;
        int nr;
        int i;
        RING_LOCALS;
@@ -148,15 +148,16 @@ void r300_init_reg_flags(void)
 
        /* these match cmducs() command in r300_driver/r300/r300_cmdbuf.c */
        ADD_RANGE(R300_SE_VPORT_XSCALE, 6);
-       ADD_RANGE(0x2080, 1);
+       ADD_RANGE(R300_VAP_CNTL, 1);
        ADD_RANGE(R300_SE_VTE_CNTL, 2);
        ADD_RANGE(0x2134, 2);
-       ADD_RANGE(0x2140, 1);
+       ADD_RANGE(R300_VAP_CNTL_STATUS, 1);
        ADD_RANGE(R300_VAP_INPUT_CNTL_0, 2);
        ADD_RANGE(0x21DC, 1);
-       ADD_RANGE(0x221C, 1);
-       ADD_RANGE(0x2220, 4);
-       ADD_RANGE(0x2288, 1);
+       ADD_RANGE(R300_VAP_UNKNOWN_221C, 1);
+       ADD_RANGE(R300_VAP_CLIP_X_0, 4);
+       ADD_RANGE(R300_VAP_PVS_WAITIDLE, 1);
+       ADD_RANGE(R300_VAP_UNKNOWN_2288, 1);
        ADD_RANGE(R300_VAP_OUTPUT_VTX_FMT_0, 2);
        ADD_RANGE(R300_VAP_PVS_CNTL_1, 3);
        ADD_RANGE(R300_GB_ENABLE, 1);
@@ -168,13 +169,13 @@ void r300_init_reg_flags(void)
        ADD_RANGE(R300_RE_POINTSIZE, 1);
        ADD_RANGE(0x4230, 3);
        ADD_RANGE(R300_RE_LINE_CNT, 1);
-       ADD_RANGE(0x4238, 1);
+       ADD_RANGE(R300_RE_UNK4238, 1);
        ADD_RANGE(0x4260, 3);
-       ADD_RANGE(0x4274, 4);
-       ADD_RANGE(0x4288, 5);
-       ADD_RANGE(0x42A0, 1);
+       ADD_RANGE(R300_RE_SHADE, 4);
+       ADD_RANGE(R300_RE_POLYGON_MODE, 5);
+       ADD_RANGE(R300_RE_ZBIAS_CNTL, 1);
        ADD_RANGE(R300_RE_ZBIAS_T_FACTOR, 4);
-       ADD_RANGE(0x42B4, 1);
+       ADD_RANGE(R300_RE_OCCLUSION_CNTL, 1);
        ADD_RANGE(R300_RE_CULL_CNTL, 1);
        ADD_RANGE(0x42C0, 2);
        ADD_RANGE(R300_RS_CNTL_0, 2);
@@ -190,22 +191,22 @@ void r300_init_reg_flags(void)
        ADD_RANGE(R300_PFS_INSTR1_0, 64);
        ADD_RANGE(R300_PFS_INSTR2_0, 64);
        ADD_RANGE(R300_PFS_INSTR3_0, 64);
-       ADD_RANGE(0x4BC0, 1);
-       ADD_RANGE(0x4BC8, 3);
+       ADD_RANGE(R300_RE_FOG_STATE, 1);
+       ADD_RANGE(R300_FOG_COLOR_R, 3);
        ADD_RANGE(R300_PP_ALPHA_TEST, 2);
        ADD_RANGE(0x4BD8, 1);
        ADD_RANGE(R300_PFS_PARAM_0_X, 64);
        ADD_RANGE(0x4E00, 1);
        ADD_RANGE(R300_RB3D_CBLEND, 2);
        ADD_RANGE(R300_RB3D_COLORMASK, 1);
-       ADD_RANGE(0x4E10, 3);
+       ADD_RANGE(R300_RB3D_BLEND_COLOR, 3);
        ADD_RANGE_MARK(R300_RB3D_COLOROFFSET0, 1, MARK_CHECK_OFFSET);   /* check offset */
        ADD_RANGE(R300_RB3D_COLORPITCH0, 1);
        ADD_RANGE(0x4E50, 9);
        ADD_RANGE(0x4E88, 1);
        ADD_RANGE(0x4EA0, 2);
        ADD_RANGE(R300_RB3D_ZSTENCIL_CNTL_0, 3);
-       ADD_RANGE(0x4F10, 4);
+       ADD_RANGE(R300_RB3D_ZSTENCIL_FORMAT, 4);
        ADD_RANGE_MARK(R300_RB3D_DEPTHOFFSET, 1, MARK_CHECK_OFFSET);    /* check offset */
        ADD_RANGE(R300_RB3D_DEPTHPITCH, 1);
        ADD_RANGE(0x4F28, 1);
@@ -224,7 +225,7 @@ void r300_init_reg_flags(void)
        ADD_RANGE(R300_TX_BORDER_COLOR_0, 16);
 
        /* Sporadic registers used as primitives are emitted */
-       ADD_RANGE(0x4f18, 1);
+       ADD_RANGE(R300_RB3D_ZCACHE_CTLSTAT, 1);
        ADD_RANGE(R300_RB3D_DSTCACHE_CTLSTAT, 1);
        ADD_RANGE(R300_VAP_INPUT_ROUTE_0_0, 8);
        ADD_RANGE(R300_VAP_INPUT_ROUTE_1_0, 8);
@@ -242,26 +243,6 @@ static __inline__ int r300_check_range(unsigned reg, int count)
        return 0;
 }
 
-/*
- * we expect offsets passed to the framebuffer to be either within video 
- * memory or within AGP space 
- */
-static __inline__ int r300_check_offset(drm_radeon_private_t *dev_priv,
-                                       u32 offset)
-{
-       /* we realy want to check against end of video aperture
-          but this value is not being kept.
-          This code is correct for now (does the same thing as the
-          code that sets MC_FB_LOCATION) in radeon_cp.c */
-       if (offset >= dev_priv->fb_location &&
-           offset < (dev_priv->fb_location + dev_priv->fb_size))
-               return 0;
-       if (offset >= dev_priv->gart_vm_start &&
-           offset < (dev_priv->gart_vm_start + dev_priv->gart_size))
-               return 0;
-       return 1;
-}
-
 static __inline__ int r300_emit_carefully_checked_packet0(drm_radeon_private_t *
                                                          dev_priv,
                                                          drm_radeon_kcmd_buffer_t
@@ -290,7 +271,7 @@ static __inline__ int r300_emit_carefully_checked_packet0(drm_radeon_private_t *
                case MARK_SAFE:
                        break;
                case MARK_CHECK_OFFSET:
-                       if (r300_check_offset(dev_priv, (u32) values[i])) {
+                       if (!radeon_check_offset(dev_priv, (u32) values[i])) {
                                DRM_ERROR
                                    ("Offset failed range check (reg=%04x sz=%d)\n",
                                     reg, sz);
@@ -452,7 +433,7 @@ static __inline__ int r300_emit_3d_load_vbpntr(drm_radeon_private_t *dev_priv,
        i = 1;
        while ((k < narrays) && (i < (count + 1))) {
                i++;            /* skip attribute field */
-               if (r300_check_offset(dev_priv, payload[i])) {
+               if (!radeon_check_offset(dev_priv, payload[i])) {
                        DRM_ERROR
                            ("Offset failed range check (k=%d i=%d) while processing 3D_LOAD_VBPNTR packet.\n",
                             k, i);
@@ -463,7 +444,7 @@ static __inline__ int r300_emit_3d_load_vbpntr(drm_radeon_private_t *dev_priv,
                if (k == narrays)
                        break;
                /* have one more to process, they come in pairs */
-               if (r300_check_offset(dev_priv, payload[i])) {
+               if (!radeon_check_offset(dev_priv, payload[i])) {
                        DRM_ERROR
                            ("Offset failed range check (k=%d i=%d) while processing 3D_LOAD_VBPNTR packet.\n",
                             k, i);
@@ -508,7 +489,7 @@ static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv,
                if (cmd[1] & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL 
                              | RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
                        offset = cmd[2] << 10;
-                       ret = r300_check_offset(dev_priv, offset);
+                       ret = !radeon_check_offset(dev_priv, offset);
                        if (ret) {
                                DRM_ERROR("Invalid bitblt first offset is %08X\n", offset);
                                return DRM_ERR(EINVAL);
@@ -518,7 +499,7 @@ static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv,
                if ((cmd[1] & RADEON_GMC_SRC_PITCH_OFFSET_CNTL) &&
                    (cmd[1] & RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
                        offset = cmd[3] << 10;
-                       ret = r300_check_offset(dev_priv, offset);
+                       ret = !radeon_check_offset(dev_priv, offset);
                        if (ret) {
                                DRM_ERROR("Invalid bitblt second offset is %08X\n", offset);
                                return DRM_ERR(EINVAL);
@@ -538,6 +519,36 @@ static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv,
        return 0;
 }
 
+static __inline__ int r300_emit_indx_buffer(drm_radeon_private_t *dev_priv,
+                                            drm_radeon_kcmd_buffer_t *cmdbuf)
+{
+       u32 *cmd = (u32 *) cmdbuf->buf;
+       int count, ret;
+       RING_LOCALS;
+
+       count=(cmd[0]>>16) & 0x3fff;
+
+       if ((cmd[1] & 0x8000ffff) != 0x80000810) {
+               DRM_ERROR("Invalid indx_buffer reg address %08X\n", cmd[1]);
+               return DRM_ERR(EINVAL);
+       }
+       ret = !radeon_check_offset(dev_priv, cmd[2]);
+       if (ret) {
+               DRM_ERROR("Invalid indx_buffer offset is %08X\n", cmd[2]);
+               return DRM_ERR(EINVAL);
+       }
+
+       BEGIN_RING(count+2);
+       OUT_RING(cmd[0]);
+       OUT_RING_TABLE((int *)(cmdbuf->buf + 4), count + 1);
+       ADVANCE_RING();
+
+       cmdbuf->buf += (count+2)*4;
+       cmdbuf->bufsz -= (count+2)*4;
+
+       return 0;
+}
+
 static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv,
                                            drm_radeon_kcmd_buffer_t *cmdbuf)
 {
@@ -578,10 +589,11 @@ static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv,
        case RADEON_CNTL_BITBLT_MULTI:
                return r300_emit_bitblt_multi(dev_priv, cmdbuf);
 
+       case RADEON_CP_INDX_BUFFER:     /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */
+               return r300_emit_indx_buffer(dev_priv, cmdbuf);
        case RADEON_CP_3D_DRAW_IMMD_2:  /* triggers drawing using in-packet vertex data */
        case RADEON_CP_3D_DRAW_VBUF_2:  /* triggers drawing of vertex buffers setup elsewhere */
        case RADEON_CP_3D_DRAW_INDX_2:  /* triggers drawing using indices to vertex buffer */
-       case RADEON_CP_INDX_BUFFER:     /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */
        case RADEON_WAIT_FOR_IDLE:
        case RADEON_CP_NOP:
                /* these packets are safe */
@@ -681,9 +693,9 @@ static __inline__ void r300_pacify(drm_radeon_private_t *dev_priv)
 
        BEGIN_RING(6);
        OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
-       OUT_RING(0xa);
-       OUT_RING(CP_PACKET0(0x4f18, 0));
-       OUT_RING(0x3);
+       OUT_RING(R300_RB3D_DSTCACHE_UNKNOWN_0A);
+       OUT_RING(CP_PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
+       OUT_RING(R300_RB3D_ZCACHE_UNKNOWN_03);
        OUT_RING(CP_PACKET3(RADEON_CP_NOP, 0));
        OUT_RING(0x0);
        ADVANCE_RING();
@@ -723,7 +735,7 @@ static int r300_scratch(drm_radeon_private_t *dev_priv,
        
        dev_priv->scratch_ages[header.scratch.reg]++;
        
-       ref_age_base = *(u32 **)cmdbuf->buf;
+       ref_age_base =  (u32 *)(unsigned long)*((uint64_t *)cmdbuf->buf);
        
        cmdbuf->buf += sizeof(u64);
        cmdbuf->bufsz -= sizeof(u64);
@@ -755,8 +767,8 @@ static int r300_scratch(drm_radeon_private_t *dev_priv,
        }
        
        BEGIN_RING(2);
-       OUT_RING(CP_PACKET0(RADEON_SCRATCH_REG0 + header.scratch.reg * 4, 0));
-       OUT_RING(dev_priv->scratch_ages[header.scratch.reg]);
+       OUT_RING( CP_PACKET0( RADEON_SCRATCH_REG0 + header.scratch.reg * 4, 0 ) );
+       OUT_RING( dev_priv->scratch_ages[header.scratch.reg] );
        ADVANCE_RING();
        
        return 0;