diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r300.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index cf862ca580bf..768c60ee4ab6 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; |
| @@ -664,6 +667,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 664 | } | 667 | } |
| 665 | track->cb[i].robj = reloc->robj; | 668 | track->cb[i].robj = reloc->robj; |
| 666 | track->cb[i].offset = idx_value; | 669 | track->cb[i].offset = idx_value; |
| 670 | track->cb_dirty = true; | ||
| 667 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); | 671 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
| 668 | break; | 672 | break; |
| 669 | case R300_ZB_DEPTHOFFSET: | 673 | case R300_ZB_DEPTHOFFSET: |
| @@ -676,6 +680,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 676 | } | 680 | } |
| 677 | track->zb.robj = reloc->robj; | 681 | track->zb.robj = reloc->robj; |
| 678 | track->zb.offset = idx_value; | 682 | track->zb.offset = idx_value; |
| 683 | track->zb_dirty = true; | ||
| 679 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); | 684 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
| 680 | break; | 685 | break; |
| 681 | case R300_TX_OFFSET_0: | 686 | case R300_TX_OFFSET_0: |
| @@ -714,6 +719,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 714 | tmp |= tile_flags; | 719 | tmp |= tile_flags; |
| 715 | ib[idx] = tmp; | 720 | ib[idx] = tmp; |
| 716 | track->textures[i].robj = reloc->robj; | 721 | track->textures[i].robj = reloc->robj; |
| 722 | track->tex_dirty = true; | ||
| 717 | break; | 723 | break; |
| 718 | /* Tracked registers */ | 724 | /* Tracked registers */ |
| 719 | case 0x2084: | 725 | case 0x2084: |
| @@ -740,6 +746,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 740 | if (p->rdev->family < CHIP_RV515) { | 746 | if (p->rdev->family < CHIP_RV515) { |
| 741 | track->maxy -= 1440; | 747 | track->maxy -= 1440; |
| 742 | } | 748 | } |
| 749 | track->cb_dirty = true; | ||
| 750 | track->zb_dirty = true; | ||
| 743 | break; | 751 | break; |
| 744 | case 0x4E00: | 752 | case 0x4E00: |
| 745 | /* RB3D_CCTL */ | 753 | /* RB3D_CCTL */ |
| @@ -749,6 +757,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 749 | return -EINVAL; | 757 | return -EINVAL; |
| 750 | } | 758 | } |
| 751 | track->num_cb = ((idx_value >> 5) & 0x3) + 1; | 759 | track->num_cb = ((idx_value >> 5) & 0x3) + 1; |
| 760 | track->cb_dirty = true; | ||
| 752 | break; | 761 | break; |
| 753 | case 0x4E38: | 762 | case 0x4E38: |
| 754 | case 0x4E3C: | 763 | case 0x4E3C: |
| @@ -811,6 +820,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 811 | ((idx_value >> 21) & 0xF)); | 820 | ((idx_value >> 21) & 0xF)); |
| 812 | return -EINVAL; | 821 | return -EINVAL; |
| 813 | } | 822 | } |
| 823 | track->cb_dirty = true; | ||
| 814 | break; | 824 | break; |
| 815 | case 0x4F00: | 825 | case 0x4F00: |
| 816 | /* ZB_CNTL */ | 826 | /* ZB_CNTL */ |
| @@ -819,6 +829,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 819 | } else { | 829 | } else { |
| 820 | track->z_enabled = false; | 830 | track->z_enabled = false; |
| 821 | } | 831 | } |
| 832 | track->zb_dirty = true; | ||
| 822 | break; | 833 | break; |
| 823 | case 0x4F10: | 834 | case 0x4F10: |
| 824 | /* ZB_FORMAT */ | 835 | /* ZB_FORMAT */ |
| @@ -835,6 +846,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 835 | (idx_value & 0xF)); | 846 | (idx_value & 0xF)); |
| 836 | return -EINVAL; | 847 | return -EINVAL; |
| 837 | } | 848 | } |
| 849 | track->zb_dirty = true; | ||
| 838 | break; | 850 | break; |
| 839 | case 0x4F24: | 851 | case 0x4F24: |
| 840 | /* ZB_DEPTHPITCH */ | 852 | /* ZB_DEPTHPITCH */ |
| @@ -858,14 +870,17 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 858 | ib[idx] = tmp; | 870 | ib[idx] = tmp; |
| 859 | 871 | ||
| 860 | track->zb.pitch = idx_value & 0x3FFC; | 872 | track->zb.pitch = idx_value & 0x3FFC; |
| 873 | track->zb_dirty = true; | ||
| 861 | break; | 874 | break; |
| 862 | case 0x4104: | 875 | case 0x4104: |
| 876 | /* TX_ENABLE */ | ||
| 863 | for (i = 0; i < 16; i++) { | 877 | for (i = 0; i < 16; i++) { |
| 864 | bool enabled; | 878 | bool enabled; |
| 865 | 879 | ||
| 866 | enabled = !!(idx_value & (1 << i)); | 880 | enabled = !!(idx_value & (1 << i)); |
| 867 | track->textures[i].enabled = enabled; | 881 | track->textures[i].enabled = enabled; |
| 868 | } | 882 | } |
| 883 | track->tex_dirty = true; | ||
| 869 | break; | 884 | break; |
| 870 | case 0x44C0: | 885 | case 0x44C0: |
| 871 | case 0x44C4: | 886 | case 0x44C4: |
| @@ -948,8 +963,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 948 | DRM_ERROR("Invalid texture format %u\n", | 963 | DRM_ERROR("Invalid texture format %u\n", |
| 949 | (idx_value & 0x1F)); | 964 | (idx_value & 0x1F)); |
| 950 | return -EINVAL; | 965 | return -EINVAL; |
| 951 | break; | ||
| 952 | } | 966 | } |
| 967 | track->tex_dirty = true; | ||
| 953 | break; | 968 | break; |
| 954 | case 0x4400: | 969 | case 0x4400: |
| 955 | case 0x4404: | 970 | case 0x4404: |
| @@ -977,6 +992,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 977 | if (tmp == 2 || tmp == 4 || tmp == 6) { | 992 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
| 978 | track->textures[i].roundup_h = false; | 993 | track->textures[i].roundup_h = false; |
| 979 | } | 994 | } |
| 995 | track->tex_dirty = true; | ||
| 980 | break; | 996 | break; |
| 981 | case 0x4500: | 997 | case 0x4500: |
| 982 | case 0x4504: | 998 | case 0x4504: |
| @@ -1014,6 +1030,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 1014 | DRM_ERROR("Forbidden bit TXFORMAT_MSB\n"); | 1030 | DRM_ERROR("Forbidden bit TXFORMAT_MSB\n"); |
| 1015 | return -EINVAL; | 1031 | return -EINVAL; |
| 1016 | } | 1032 | } |
| 1033 | track->tex_dirty = true; | ||
| 1017 | break; | 1034 | break; |
| 1018 | case 0x4480: | 1035 | case 0x4480: |
| 1019 | case 0x4484: | 1036 | case 0x4484: |
| @@ -1043,6 +1060,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 1043 | track->textures[i].use_pitch = !!tmp; | 1060 | track->textures[i].use_pitch = !!tmp; |
| 1044 | tmp = (idx_value >> 22) & 0xF; | 1061 | tmp = (idx_value >> 22) & 0xF; |
| 1045 | track->textures[i].txdepth = tmp; | 1062 | track->textures[i].txdepth = tmp; |
| 1063 | track->tex_dirty = true; | ||
| 1046 | break; | 1064 | break; |
| 1047 | case R300_ZB_ZPASS_ADDR: | 1065 | case R300_ZB_ZPASS_ADDR: |
| 1048 | r = r100_cs_packet_next_reloc(p, &reloc); | 1066 | r = r100_cs_packet_next_reloc(p, &reloc); |
| @@ -1057,6 +1075,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 1057 | case 0x4e0c: | 1075 | case 0x4e0c: |
| 1058 | /* RB3D_COLOR_CHANNEL_MASK */ | 1076 | /* RB3D_COLOR_CHANNEL_MASK */ |
| 1059 | track->color_channel_mask = idx_value; | 1077 | track->color_channel_mask = idx_value; |
| 1078 | track->cb_dirty = true; | ||
| 1060 | break; | 1079 | break; |
| 1061 | case 0x43a4: | 1080 | case 0x43a4: |
| 1062 | /* SC_HYPERZ_EN */ | 1081 | /* SC_HYPERZ_EN */ |
| @@ -1070,6 +1089,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 1070 | case 0x4f1c: | 1089 | case 0x4f1c: |
| 1071 | /* ZB_BW_CNTL */ | 1090 | /* ZB_BW_CNTL */ |
| 1072 | track->zb_cb_clear = !!(idx_value & (1 << 5)); | 1091 | track->zb_cb_clear = !!(idx_value & (1 << 5)); |
| 1092 | track->cb_dirty = true; | ||
| 1093 | track->zb_dirty = true; | ||
| 1073 | if (p->rdev->hyperz_filp != p->filp) { | 1094 | if (p->rdev->hyperz_filp != p->filp) { |
| 1074 | if (idx_value & (R300_HIZ_ENABLE | | 1095 | if (idx_value & (R300_HIZ_ENABLE | |
| 1075 | R300_RD_COMP_ENABLE | | 1096 | R300_RD_COMP_ENABLE | |
| @@ -1081,8 +1102,28 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 1081 | case 0x4e04: | 1102 | case 0x4e04: |
| 1082 | /* RB3D_BLENDCNTL */ | 1103 | /* RB3D_BLENDCNTL */ |
| 1083 | track->blend_read_enable = !!(idx_value & (1 << 2)); | 1104 | track->blend_read_enable = !!(idx_value & (1 << 2)); |
| 1105 | track->cb_dirty = true; | ||
| 1106 | break; | ||
| 1107 | case R300_RB3D_AARESOLVE_OFFSET: | ||
| 1108 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
| 1109 | if (r) { | ||
| 1110 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", | ||
| 1111 | idx, reg); | ||
| 1112 | r100_cs_dump_packet(p, pkt); | ||
| 1113 | return r; | ||
| 1114 | } | ||
| 1115 | track->aa.robj = reloc->robj; | ||
| 1116 | track->aa.offset = idx_value; | ||
| 1117 | track->aa_dirty = true; | ||
| 1118 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); | ||
| 1119 | break; | ||
| 1120 | case R300_RB3D_AARESOLVE_PITCH: | ||
| 1121 | track->aa.pitch = idx_value & 0x3FFE; | ||
| 1122 | track->aa_dirty = true; | ||
| 1084 | break; | 1123 | break; |
| 1085 | case 0x4f28: /* ZB_DEPTHCLEARVALUE */ | 1124 | case R300_RB3D_AARESOLVE_CTL: |
| 1125 | track->aaresolve = idx_value & 0x1; | ||
| 1126 | track->aa_dirty = true; | ||
| 1086 | break; | 1127 | break; |
| 1087 | case 0x4f30: /* ZB_MASK_OFFSET */ | 1128 | case 0x4f30: /* ZB_MASK_OFFSET */ |
| 1088 | case 0x4f34: /* ZB_ZMASK_PITCH */ | 1129 | case 0x4f34: /* ZB_ZMASK_PITCH */ |
