diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r300.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 58eab5d4730..c827738ad7d 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -1048,14 +1048,47 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1048 | /* RB3D_COLOR_CHANNEL_MASK */ | 1048 | /* RB3D_COLOR_CHANNEL_MASK */ |
1049 | track->color_channel_mask = idx_value; | 1049 | track->color_channel_mask = idx_value; |
1050 | break; | 1050 | break; |
1051 | case 0x4d1c: | 1051 | case 0x43a4: |
1052 | /* SC_HYPERZ_EN */ | ||
1053 | /* r300c emits this register - we need to disable hyperz for it | ||
1054 | * without complaining */ | ||
1055 | if (p->rdev->hyperz_filp != p->filp) { | ||
1056 | if (idx_value & 0x1) | ||
1057 | ib[idx] = idx_value & ~1; | ||
1058 | } | ||
1059 | break; | ||
1060 | case 0x4f1c: | ||
1052 | /* ZB_BW_CNTL */ | 1061 | /* ZB_BW_CNTL */ |
1053 | track->zb_cb_clear = !!(idx_value & (1 << 5)); | 1062 | track->zb_cb_clear = !!(idx_value & (1 << 5)); |
1063 | if (p->rdev->hyperz_filp != p->filp) { | ||
1064 | if (idx_value & (R300_HIZ_ENABLE | | ||
1065 | R300_RD_COMP_ENABLE | | ||
1066 | R300_WR_COMP_ENABLE | | ||
1067 | R300_FAST_FILL_ENABLE)) | ||
1068 | goto fail; | ||
1069 | } | ||
1054 | break; | 1070 | break; |
1055 | case 0x4e04: | 1071 | case 0x4e04: |
1056 | /* RB3D_BLENDCNTL */ | 1072 | /* RB3D_BLENDCNTL */ |
1057 | track->blend_read_enable = !!(idx_value & (1 << 2)); | 1073 | track->blend_read_enable = !!(idx_value & (1 << 2)); |
1058 | break; | 1074 | break; |
1075 | case 0x4f28: /* ZB_DEPTHCLEARVALUE */ | ||
1076 | break; | ||
1077 | case 0x4f30: /* ZB_MASK_OFFSET */ | ||
1078 | case 0x4f34: /* ZB_ZMASK_PITCH */ | ||
1079 | case 0x4f44: /* ZB_HIZ_OFFSET */ | ||
1080 | case 0x4f54: /* ZB_HIZ_PITCH */ | ||
1081 | if (idx_value && (p->rdev->hyperz_filp != p->filp)) | ||
1082 | goto fail; | ||
1083 | break; | ||
1084 | case 0x4028: | ||
1085 | if (idx_value && (p->rdev->hyperz_filp != p->filp)) | ||
1086 | goto fail; | ||
1087 | /* GB_Z_PEQ_CONFIG */ | ||
1088 | if (p->rdev->family >= CHIP_RV350) | ||
1089 | break; | ||
1090 | goto fail; | ||
1091 | break; | ||
1059 | case 0x4be8: | 1092 | case 0x4be8: |
1060 | /* valid register only on RV530 */ | 1093 | /* valid register only on RV530 */ |
1061 | if (p->rdev->family == CHIP_RV530) | 1094 | if (p->rdev->family == CHIP_RV530) |
@@ -1066,8 +1099,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1066 | } | 1099 | } |
1067 | return 0; | 1100 | return 0; |
1068 | fail: | 1101 | fail: |
1069 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", | 1102 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d (val=%08x)\n", |
1070 | reg, idx); | 1103 | reg, idx, idx_value); |
1071 | return -EINVAL; | 1104 | return -EINVAL; |
1072 | } | 1105 | } |
1073 | 1106 | ||
@@ -1161,6 +1194,11 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
1161 | return r; | 1194 | return r; |
1162 | } | 1195 | } |
1163 | break; | 1196 | break; |
1197 | case PACKET3_3D_CLEAR_HIZ: | ||
1198 | case PACKET3_3D_CLEAR_ZMASK: | ||
1199 | if (p->rdev->hyperz_filp != p->filp) | ||
1200 | return -EINVAL; | ||
1201 | break; | ||
1164 | case PACKET3_NOP: | 1202 | case PACKET3_NOP: |
1165 | break; | 1203 | break; |
1166 | default: | 1204 | default: |