diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2011-03-02 20:07:37 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-03-02 20:56:56 -0500 |
commit | c175ca9a4c8cb30a61ccefacf8243350e1db4162 (patch) | |
tree | 0aba17024ba7363276cb9904b228bcffc12c938c /drivers/gpu/drm/radeon/evergreen_cs.c | |
parent | e348762955ebb2d4a6906d920b8f538637f1093f (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.c | 55 |
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 | ||
33 | static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p, | 34 | static 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"); |