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 | |
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')
-rw-r--r-- | drivers/gpu/drm/radeon/Makefile | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_cs.c | 55 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreend.h | 9 |
3 files changed, 62 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile index acdde40e8e5d..3896ef811102 100644 --- a/drivers/gpu/drm/radeon/Makefile +++ b/drivers/gpu/drm/radeon/Makefile | |||
@@ -53,7 +53,7 @@ $(obj)/rs600.o: $(obj)/rs600_reg_safe.h | |||
53 | 53 | ||
54 | $(obj)/r600_cs.o: $(obj)/r600_reg_safe.h | 54 | $(obj)/r600_cs.o: $(obj)/r600_reg_safe.h |
55 | 55 | ||
56 | $(obj)/evergreen_cs.o: $(obj)/evergreen_reg_safe.h | 56 | $(obj)/evergreen_cs.o: $(obj)/evergreen_reg_safe.h $(obj)/cayman_reg_safe.h |
57 | 57 | ||
58 | radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o \ | 58 | radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o \ |
59 | radeon_irq.o r300_cmdbuf.o r600_cp.o | 59 | radeon_irq.o r300_cmdbuf.o r600_cp.o |
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"); |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index afec1aca2a73..328f2a4d1962 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
@@ -1092,5 +1092,14 @@ | |||
1092 | #define SQ_TEX_RESOURCE_WORD6_0 0x30018 | 1092 | #define SQ_TEX_RESOURCE_WORD6_0 0x30018 |
1093 | #define SQ_TEX_RESOURCE_WORD7_0 0x3001c | 1093 | #define SQ_TEX_RESOURCE_WORD7_0 0x3001c |
1094 | 1094 | ||
1095 | /* cayman 3D regs */ | ||
1096 | #define CAYMAN_VGT_OFFCHIP_LDS_BASE 0x89B0 | ||
1097 | #define CAYMAN_DB_EQAA 0x28804 | ||
1098 | #define CAYMAN_DB_DEPTH_INFO 0x2803C | ||
1099 | #define CAYMAN_PA_SC_AA_CONFIG 0x28BE0 | ||
1100 | #define CAYMAN_MSAA_NUM_SAMPLES_SHIFT 0 | ||
1101 | #define CAYMAN_MSAA_NUM_SAMPLES_MASK 0x7 | ||
1102 | /* cayman packet3 addition */ | ||
1103 | #define CAYMAN_PACKET3_DEALLOC_STATE 0x14 | ||
1095 | 1104 | ||
1096 | #endif | 1105 | #endif |