aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/evergreen_cs.c
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2011-03-02 20:07:37 -0500
committerDave Airlie <airlied@redhat.com>2011-03-02 20:56:56 -0500
commitc175ca9a4c8cb30a61ccefacf8243350e1db4162 (patch)
tree0aba17024ba7363276cb9904b228bcffc12c938c /drivers/gpu/drm/radeon/evergreen_cs.c
parente348762955ebb2d4a6906d920b8f538637f1093f (diff)
drm/radeon/kms: add cayman CS check support
Added to existing evergreen CS checker. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen_cs.c')
-rw-r--r--drivers/gpu/drm/radeon/evergreen_cs.c55
1 files changed, 52 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
index 5c84fca00d36..5021bd2c1613 100644
--- a/drivers/gpu/drm/radeon/evergreen_cs.c
+++ b/drivers/gpu/drm/radeon/evergreen_cs.c
@@ -29,6 +29,7 @@
29#include "radeon.h" 29#include "radeon.h"
30#include "evergreend.h" 30#include "evergreend.h"
31#include "evergreen_reg_safe.h" 31#include "evergreen_reg_safe.h"
32#include "cayman_reg_safe.h"
32 33
33static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p, 34static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p,
34 struct radeon_cs_reloc **cs_reloc); 35 struct radeon_cs_reloc **cs_reloc);
@@ -425,18 +426,28 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
425{ 426{
426 struct evergreen_cs_track *track = (struct evergreen_cs_track *)p->track; 427 struct evergreen_cs_track *track = (struct evergreen_cs_track *)p->track;
427 struct radeon_cs_reloc *reloc; 428 struct radeon_cs_reloc *reloc;
428 u32 last_reg = ARRAY_SIZE(evergreen_reg_safe_bm); 429 u32 last_reg;
429 u32 m, i, tmp, *ib; 430 u32 m, i, tmp, *ib;
430 int r; 431 int r;
431 432
433 if (p->rdev->family >= CHIP_CAYMAN)
434 last_reg = ARRAY_SIZE(cayman_reg_safe_bm);
435 else
436 last_reg = ARRAY_SIZE(evergreen_reg_safe_bm);
437
432 i = (reg >> 7); 438 i = (reg >> 7);
433 if (i > last_reg) { 439 if (i > last_reg) {
434 dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); 440 dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx);
435 return -EINVAL; 441 return -EINVAL;
436 } 442 }
437 m = 1 << ((reg >> 2) & 31); 443 m = 1 << ((reg >> 2) & 31);
438 if (!(evergreen_reg_safe_bm[i] & m)) 444 if (p->rdev->family >= CHIP_CAYMAN) {
439 return 0; 445 if (!(cayman_reg_safe_bm[i] & m))
446 return 0;
447 } else {
448 if (!(evergreen_reg_safe_bm[i] & m))
449 return 0;
450 }
440 ib = p->ib->ptr; 451 ib = p->ib->ptr;
441 switch (reg) { 452 switch (reg) {
442 /* force following reg to 0 in an attemp to disable out buffer 453 /* force following reg to 0 in an attemp to disable out buffer
@@ -474,6 +485,20 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
474 case DB_DEPTH_CONTROL: 485 case DB_DEPTH_CONTROL:
475 track->db_depth_control = radeon_get_ib_value(p, idx); 486 track->db_depth_control = radeon_get_ib_value(p, idx);
476 break; 487 break;
488 case CAYMAN_DB_EQAA:
489 if (p->rdev->family < CHIP_CAYMAN) {
490 dev_warn(p->dev, "bad SET_CONTEXT_REG "
491 "0x%04X\n", reg);
492 return -EINVAL;
493 }
494 break;
495 case CAYMAN_DB_DEPTH_INFO:
496 if (p->rdev->family < CHIP_CAYMAN) {
497 dev_warn(p->dev, "bad SET_CONTEXT_REG "
498 "0x%04X\n", reg);
499 return -EINVAL;
500 }
501 break;
477 case DB_Z_INFO: 502 case DB_Z_INFO:
478 r = evergreen_cs_packet_next_reloc(p, &reloc); 503 r = evergreen_cs_packet_next_reloc(p, &reloc);
479 if (r) { 504 if (r) {
@@ -559,9 +584,23 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
559 track->cb_shader_mask = radeon_get_ib_value(p, idx); 584 track->cb_shader_mask = radeon_get_ib_value(p, idx);
560 break; 585 break;
561 case PA_SC_AA_CONFIG: 586 case PA_SC_AA_CONFIG:
587 if (p->rdev->family >= CHIP_CAYMAN) {
588 dev_warn(p->dev, "bad SET_CONTEXT_REG "
589 "0x%04X\n", reg);
590 return -EINVAL;
591 }
562 tmp = radeon_get_ib_value(p, idx) & MSAA_NUM_SAMPLES_MASK; 592 tmp = radeon_get_ib_value(p, idx) & MSAA_NUM_SAMPLES_MASK;
563 track->nsamples = 1 << tmp; 593 track->nsamples = 1 << tmp;
564 break; 594 break;
595 case CAYMAN_PA_SC_AA_CONFIG:
596 if (p->rdev->family < CHIP_CAYMAN) {
597 dev_warn(p->dev, "bad SET_CONTEXT_REG "
598 "0x%04X\n", reg);
599 return -EINVAL;
600 }
601 tmp = radeon_get_ib_value(p, idx) & CAYMAN_MSAA_NUM_SAMPLES_MASK;
602 track->nsamples = 1 << tmp;
603 break;
565 case CB_COLOR0_VIEW: 604 case CB_COLOR0_VIEW:
566 case CB_COLOR1_VIEW: 605 case CB_COLOR1_VIEW:
567 case CB_COLOR2_VIEW: 606 case CB_COLOR2_VIEW:
@@ -987,6 +1026,16 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
987 return -EINVAL; 1026 return -EINVAL;
988 } 1027 }
989 break; 1028 break;
1029 case CAYMAN_PACKET3_DEALLOC_STATE:
1030 if (p->rdev->family < CHIP_CAYMAN) {
1031 DRM_ERROR("bad PACKET3_DEALLOC_STATE\n");
1032 return -EINVAL;
1033 }
1034 if (pkt->count) {
1035 DRM_ERROR("bad INDEX_TYPE/NUM_INSTANCES/CLEAR_STATE\n");
1036 return -EINVAL;
1037 }
1038 break;
990 case PACKET3_INDEX_BASE: 1039 case PACKET3_INDEX_BASE:
991 if (pkt->count != 1) { 1040 if (pkt->count != 1) {
992 DRM_ERROR("bad INDEX_BASE\n"); 1041 DRM_ERROR("bad INDEX_BASE\n");