Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: update radeon to 1.25 add r200 vertex program support

Add support for r200 vertex programs (R200_EMIT_VAP_PVS_CNTL, and new
packet type for making it possible to address whole tcl vector space
and have a larger count)

From: Roland Scheidegger (DRM CVS)
Signed-off-by: Dave Airlie <airlied@linux.ie>

+48 -3
+6 -1
drivers/char/drm/radeon_drm.h
··· 161 161 #define R200_EMIT_PP_TXCTLALL_3 91 162 162 #define R200_EMIT_PP_TXCTLALL_4 92 163 163 #define R200_EMIT_PP_TXCTLALL_5 93 164 - #define RADEON_MAX_STATE_PACKETS 94 164 + #define R200_EMIT_VAP_PVS_CNTL 94 165 + #define RADEON_MAX_STATE_PACKETS 95 165 166 166 167 /* Commands understood by cmd_buffer ioctl. More can be added but 167 168 * obviously these can't be removed or changed: ··· 177 176 #define RADEON_CMD_WAIT 8 /* emit hw wait commands -- note: 178 177 * doesn't make the cpu wait, just 179 178 * the graphics hardware */ 179 + #define RADEON_CMD_VECLINEAR 9 /* another r200 stopgap */ 180 180 181 181 typedef union { 182 182 int i; ··· 193 191 struct { 194 192 unsigned char cmd_type, offset, stride, count; 195 193 } vectors; 194 + struct { 195 + unsigned char cmd_type, addr_lo, addr_hi, count; 196 + } veclinear; 196 197 struct { 197 198 unsigned char cmd_type, buf_idx, pad0, pad1; 198 199 } dma;
+6 -2
drivers/char/drm/radeon_drv.h
··· 38 38 39 39 #define DRIVER_NAME "radeon" 40 40 #define DRIVER_DESC "ATI Radeon" 41 - #define DRIVER_DATE "20060519" 41 + #define DRIVER_DATE "20060524" 42 42 43 43 /* Interface history: 44 44 * ··· 93 93 * 1.22- Add support for texture cache flushes (R300_TX_CNTL) 94 94 * 1.23- Add new radeon memory map work from benh 95 95 * 1.24- Add general-purpose packet for manipulating scratch registers (r300) 96 + * 1.25- Add support for r200 vertex programs (R200_EMIT_VAP_PVS_CNTL, 97 + * new packet type) 96 98 */ 97 99 #define DRIVER_MAJOR 1 98 - #define DRIVER_MINOR 24 100 + #define DRIVER_MINOR 25 99 101 #define DRIVER_PATCHLEVEL 0 100 102 101 103 /* ··· 908 906 909 907 #define R200_PP_AFS_0 0x2f80 910 908 #define R200_PP_AFS_1 0x2f00 /* same as txcblend_0 */ 909 + 910 + #define R200_VAP_PVS_CNTL_1 0x22D0 911 911 912 912 /* Constants */ 913 913 #define RADEON_MAX_USEC_TIMEOUT 100000 /* 100 ms */
+36
drivers/char/drm/radeon_state.c
··· 249 249 case R200_EMIT_PP_TXCTLALL_3: 250 250 case R200_EMIT_PP_TXCTLALL_4: 251 251 case R200_EMIT_PP_TXCTLALL_5: 252 + case R200_EMIT_VAP_PVS_CNTL: 252 253 /* These packets don't contain memory offsets */ 253 254 break; 254 255 ··· 627 626 {R200_PP_TXFILTER_3, 8, "R200_PP_TXCTLALL_3"}, 628 627 {R200_PP_TXFILTER_4, 8, "R200_PP_TXCTLALL_4"}, 629 628 {R200_PP_TXFILTER_5, 8, "R200_PP_TXCTLALL_5"}, 629 + {R200_VAP_PVS_CNTL_1, 2, "R200_VAP_PVS_CNTL"}, 630 630 }; 631 631 632 632 /* ================================================================ ··· 2610 2608 return 0; 2611 2609 } 2612 2610 2611 + static __inline__ int radeon_emit_veclinear(drm_radeon_private_t *dev_priv, 2612 + drm_radeon_cmd_header_t header, 2613 + drm_radeon_kcmd_buffer_t *cmdbuf) 2614 + { 2615 + int sz = header.veclinear.count * 4; 2616 + int start = header.veclinear.addr_lo | (header.veclinear.addr_hi << 8); 2617 + RING_LOCALS; 2618 + 2619 + if (!sz) 2620 + return 0; 2621 + if (sz * 4 > cmdbuf->bufsz) 2622 + return DRM_ERR(EINVAL); 2623 + 2624 + BEGIN_RING(5 + sz); 2625 + OUT_RING_REG(RADEON_SE_TCL_STATE_FLUSH, 0); 2626 + OUT_RING(CP_PACKET0(RADEON_SE_TCL_VECTOR_INDX_REG, 0)); 2627 + OUT_RING(start | (1 << RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT)); 2628 + OUT_RING(CP_PACKET0_TABLE(RADEON_SE_TCL_VECTOR_DATA_REG, (sz - 1))); 2629 + OUT_RING_TABLE(cmdbuf->buf, sz); 2630 + ADVANCE_RING(); 2631 + 2632 + cmdbuf->buf += sz * sizeof(int); 2633 + cmdbuf->bufsz -= sz * sizeof(int); 2634 + return 0; 2635 + } 2636 + 2613 2637 static int radeon_emit_packet3(drm_device_t * dev, 2614 2638 drm_file_t * filp_priv, 2615 2639 drm_radeon_kcmd_buffer_t *cmdbuf) ··· 2894 2866 goto err; 2895 2867 } 2896 2868 break; 2869 + case RADEON_CMD_VECLINEAR: 2870 + DRM_DEBUG("RADEON_CMD_VECLINEAR\n"); 2871 + if (radeon_emit_veclinear(dev_priv, header, &cmdbuf)) { 2872 + DRM_ERROR("radeon_emit_veclinear failed\n"); 2873 + goto err; 2874 + } 2875 + break; 2876 + 2897 2877 default: 2898 2878 DRM_ERROR("bad cmd_type %d at %p\n", 2899 2879 header.header.cmd_type,