diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r300.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 561048a7c0a4..bd75f99bd65e 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -325,11 +325,12 @@ void r300_gpu_init(struct radeon_device *rdev) | |||
325 | 325 | ||
326 | r100_hdp_reset(rdev); | 326 | r100_hdp_reset(rdev); |
327 | /* FIXME: rv380 one pipes ? */ | 327 | /* FIXME: rv380 one pipes ? */ |
328 | if ((rdev->family == CHIP_R300) || (rdev->family == CHIP_R350)) { | 328 | if ((rdev->family == CHIP_R300 && rdev->pdev->device != 0x4144) || |
329 | (rdev->family == CHIP_R350)) { | ||
329 | /* r300,r350 */ | 330 | /* r300,r350 */ |
330 | rdev->num_gb_pipes = 2; | 331 | rdev->num_gb_pipes = 2; |
331 | } else { | 332 | } else { |
332 | /* rv350,rv370,rv380 */ | 333 | /* rv350,rv370,rv380,r300 AD */ |
333 | rdev->num_gb_pipes = 1; | 334 | rdev->num_gb_pipes = 1; |
334 | } | 335 | } |
335 | rdev->num_z_pipes = 1; | 336 | rdev->num_z_pipes = 1; |
@@ -729,6 +730,12 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
729 | /* VAP_VF_MAX_VTX_INDX */ | 730 | /* VAP_VF_MAX_VTX_INDX */ |
730 | track->max_indx = idx_value & 0x00FFFFFFUL; | 731 | track->max_indx = idx_value & 0x00FFFFFFUL; |
731 | break; | 732 | break; |
733 | case 0x2088: | ||
734 | /* VAP_ALT_NUM_VERTICES - only valid on r500 */ | ||
735 | if (p->rdev->family < CHIP_RV515) | ||
736 | goto fail; | ||
737 | track->vap_alt_nverts = idx_value & 0xFFFFFF; | ||
738 | break; | ||
732 | case 0x43E4: | 739 | case 0x43E4: |
733 | /* SC_SCISSOR1 */ | 740 | /* SC_SCISSOR1 */ |
734 | track->maxy = ((idx_value >> 13) & 0x1FFF) + 1; | 741 | track->maxy = ((idx_value >> 13) & 0x1FFF) + 1; |
@@ -766,7 +773,6 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
766 | tmp = idx_value & ~(0x7 << 16); | 773 | tmp = idx_value & ~(0x7 << 16); |
767 | tmp |= tile_flags; | 774 | tmp |= tile_flags; |
768 | ib[idx] = tmp; | 775 | ib[idx] = tmp; |
769 | |||
770 | i = (reg - 0x4E38) >> 2; | 776 | i = (reg - 0x4E38) >> 2; |
771 | track->cb[i].pitch = idx_value & 0x3FFE; | 777 | track->cb[i].pitch = idx_value & 0x3FFE; |
772 | switch (((idx_value >> 21) & 0xF)) { | 778 | switch (((idx_value >> 21) & 0xF)) { |
@@ -1051,11 +1057,13 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1051 | break; | 1057 | break; |
1052 | /* fallthrough do not move */ | 1058 | /* fallthrough do not move */ |
1053 | default: | 1059 | default: |
1054 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", | 1060 | goto fail; |
1055 | reg, idx); | ||
1056 | return -EINVAL; | ||
1057 | } | 1061 | } |
1058 | return 0; | 1062 | return 0; |
1063 | fail: | ||
1064 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", | ||
1065 | reg, idx); | ||
1066 | return -EINVAL; | ||
1059 | } | 1067 | } |
1060 | 1068 | ||
1061 | static int r300_packet3_check(struct radeon_cs_parser *p, | 1069 | static int r300_packet3_check(struct radeon_cs_parser *p, |