diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r300.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index cde1d3480d93..55fe5ba7def3 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -69,6 +69,9 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) | |||
69 | mb(); | 69 | mb(); |
70 | } | 70 | } |
71 | 71 | ||
72 | #define R300_PTE_WRITEABLE (1 << 2) | ||
73 | #define R300_PTE_READABLE (1 << 3) | ||
74 | |||
72 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | 75 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
73 | { | 76 | { |
74 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; | 77 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; |
@@ -78,7 +81,7 @@ int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
78 | } | 81 | } |
79 | addr = (lower_32_bits(addr) >> 8) | | 82 | addr = (lower_32_bits(addr) >> 8) | |
80 | ((upper_32_bits(addr) & 0xff) << 24) | | 83 | ((upper_32_bits(addr) & 0xff) << 24) | |
81 | 0xc; | 84 | R300_PTE_WRITEABLE | R300_PTE_READABLE; |
82 | /* on x86 we want this to be CPU endian, on powerpc | 85 | /* on x86 we want this to be CPU endian, on powerpc |
83 | * on powerpc without HW swappers, it'll get swapped on way | 86 | * on powerpc without HW swappers, it'll get swapped on way |
84 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ | 87 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ |
@@ -135,7 +138,7 @@ int rv370_pcie_gart_enable(struct radeon_device *rdev) | |||
135 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_start); | 138 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_start); |
136 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0); | 139 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0); |
137 | /* Clear error */ | 140 | /* Clear error */ |
138 | WREG32_PCIE(0x18, 0); | 141 | WREG32_PCIE(RADEON_PCIE_TX_GART_ERROR, 0); |
139 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); | 142 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
140 | tmp |= RADEON_PCIE_TX_GART_EN; | 143 | tmp |= RADEON_PCIE_TX_GART_EN; |
141 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; | 144 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
@@ -405,12 +408,13 @@ int r300_asic_reset(struct radeon_device *rdev) | |||
405 | { | 408 | { |
406 | struct r100_mc_save save; | 409 | struct r100_mc_save save; |
407 | u32 status, tmp; | 410 | u32 status, tmp; |
411 | int ret = 0; | ||
408 | 412 | ||
409 | r100_mc_stop(rdev, &save); | ||
410 | status = RREG32(R_000E40_RBBM_STATUS); | 413 | status = RREG32(R_000E40_RBBM_STATUS); |
411 | if (!G_000E40_GUI_ACTIVE(status)) { | 414 | if (!G_000E40_GUI_ACTIVE(status)) { |
412 | return 0; | 415 | return 0; |
413 | } | 416 | } |
417 | r100_mc_stop(rdev, &save); | ||
414 | status = RREG32(R_000E40_RBBM_STATUS); | 418 | status = RREG32(R_000E40_RBBM_STATUS); |
415 | dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); | 419 | dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); |
416 | /* stop CP */ | 420 | /* stop CP */ |
@@ -451,11 +455,11 @@ int r300_asic_reset(struct radeon_device *rdev) | |||
451 | if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) { | 455 | if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) { |
452 | dev_err(rdev->dev, "failed to reset GPU\n"); | 456 | dev_err(rdev->dev, "failed to reset GPU\n"); |
453 | rdev->gpu_lockup = true; | 457 | rdev->gpu_lockup = true; |
454 | return -1; | 458 | ret = -1; |
455 | } | 459 | } else |
460 | dev_info(rdev->dev, "GPU reset succeed\n"); | ||
456 | r100_mc_resume(rdev, &save); | 461 | r100_mc_resume(rdev, &save); |
457 | dev_info(rdev->dev, "GPU reset succeed\n"); | 462 | return ret; |
458 | return 0; | ||
459 | } | 463 | } |
460 | 464 | ||
461 | /* | 465 | /* |
@@ -558,10 +562,7 @@ int rv370_get_pcie_lanes(struct radeon_device *rdev) | |||
558 | 562 | ||
559 | /* FIXME wait for idle */ | 563 | /* FIXME wait for idle */ |
560 | 564 | ||
561 | if (rdev->family < CHIP_R600) | 565 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); |
562 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); | ||
563 | else | ||
564 | link_width_cntl = RREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL); | ||
565 | 566 | ||
566 | switch ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) >> RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT) { | 567 | switch ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) >> RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT) { |
567 | case RADEON_PCIE_LC_LINK_WIDTH_X0: | 568 | case RADEON_PCIE_LC_LINK_WIDTH_X0: |
@@ -745,6 +746,11 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
745 | break; | 746 | break; |
746 | case 0x4E00: | 747 | case 0x4E00: |
747 | /* RB3D_CCTL */ | 748 | /* RB3D_CCTL */ |
749 | if ((idx_value & (1 << 10)) && /* CMASK_ENABLE */ | ||
750 | p->rdev->cmask_filp != p->filp) { | ||
751 | DRM_ERROR("Invalid RB3D_CCTL: Cannot enable CMASK.\n"); | ||
752 | return -EINVAL; | ||
753 | } | ||
748 | track->num_cb = ((idx_value >> 5) & 0x3) + 1; | 754 | track->num_cb = ((idx_value >> 5) & 0x3) + 1; |
749 | break; | 755 | break; |
750 | case 0x4E38: | 756 | case 0x4E38: |
@@ -787,6 +793,13 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
787 | case 15: | 793 | case 15: |
788 | track->cb[i].cpp = 2; | 794 | track->cb[i].cpp = 2; |
789 | break; | 795 | break; |
796 | case 5: | ||
797 | if (p->rdev->family < CHIP_RV515) { | ||
798 | DRM_ERROR("Invalid color buffer format (%d)!\n", | ||
799 | ((idx_value >> 21) & 0xF)); | ||
800 | return -EINVAL; | ||
801 | } | ||
802 | /* Pass through. */ | ||
790 | case 6: | 803 | case 6: |
791 | track->cb[i].cpp = 4; | 804 | track->cb[i].cpp = 4; |
792 | break; | 805 | break; |
@@ -1199,6 +1212,10 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
1199 | if (p->rdev->hyperz_filp != p->filp) | 1212 | if (p->rdev->hyperz_filp != p->filp) |
1200 | return -EINVAL; | 1213 | return -EINVAL; |
1201 | break; | 1214 | break; |
1215 | case PACKET3_3D_CLEAR_CMASK: | ||
1216 | if (p->rdev->cmask_filp != p->filp) | ||
1217 | return -EINVAL; | ||
1218 | break; | ||
1202 | case PACKET3_NOP: | 1219 | case PACKET3_NOP: |
1203 | break; | 1220 | break; |
1204 | default: | 1221 | default: |