diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r300.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index cf862ca580bf..069efa8c8ecf 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: |
@@ -895,6 +910,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
895 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | 910 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; |
896 | break; | 911 | break; |
897 | case R300_TX_FORMAT_X16: | 912 | case R300_TX_FORMAT_X16: |
913 | case R300_TX_FORMAT_FL_I16: | ||
898 | case R300_TX_FORMAT_Y8X8: | 914 | case R300_TX_FORMAT_Y8X8: |
899 | case R300_TX_FORMAT_Z5Y6X5: | 915 | case R300_TX_FORMAT_Z5Y6X5: |
900 | case R300_TX_FORMAT_Z6Y5X5: | 916 | case R300_TX_FORMAT_Z6Y5X5: |
@@ -907,6 +923,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
907 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | 923 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; |
908 | break; | 924 | break; |
909 | case R300_TX_FORMAT_Y16X16: | 925 | case R300_TX_FORMAT_Y16X16: |
926 | case R300_TX_FORMAT_FL_I16A16: | ||
910 | case R300_TX_FORMAT_Z11Y11X10: | 927 | case R300_TX_FORMAT_Z11Y11X10: |
911 | case R300_TX_FORMAT_Z10Y11X11: | 928 | case R300_TX_FORMAT_Z10Y11X11: |
912 | case R300_TX_FORMAT_W8Z8Y8X8: | 929 | case R300_TX_FORMAT_W8Z8Y8X8: |
@@ -948,8 +965,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
948 | DRM_ERROR("Invalid texture format %u\n", | 965 | DRM_ERROR("Invalid texture format %u\n", |
949 | (idx_value & 0x1F)); | 966 | (idx_value & 0x1F)); |
950 | return -EINVAL; | 967 | return -EINVAL; |
951 | break; | ||
952 | } | 968 | } |
969 | track->tex_dirty = true; | ||
953 | break; | 970 | break; |
954 | case 0x4400: | 971 | case 0x4400: |
955 | case 0x4404: | 972 | case 0x4404: |
@@ -977,6 +994,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
977 | if (tmp == 2 || tmp == 4 || tmp == 6) { | 994 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
978 | track->textures[i].roundup_h = false; | 995 | track->textures[i].roundup_h = false; |
979 | } | 996 | } |
997 | track->tex_dirty = true; | ||
980 | break; | 998 | break; |
981 | case 0x4500: | 999 | case 0x4500: |
982 | case 0x4504: | 1000 | case 0x4504: |
@@ -1014,6 +1032,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1014 | DRM_ERROR("Forbidden bit TXFORMAT_MSB\n"); | 1032 | DRM_ERROR("Forbidden bit TXFORMAT_MSB\n"); |
1015 | return -EINVAL; | 1033 | return -EINVAL; |
1016 | } | 1034 | } |
1035 | track->tex_dirty = true; | ||
1017 | break; | 1036 | break; |
1018 | case 0x4480: | 1037 | case 0x4480: |
1019 | case 0x4484: | 1038 | case 0x4484: |
@@ -1043,6 +1062,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1043 | track->textures[i].use_pitch = !!tmp; | 1062 | track->textures[i].use_pitch = !!tmp; |
1044 | tmp = (idx_value >> 22) & 0xF; | 1063 | tmp = (idx_value >> 22) & 0xF; |
1045 | track->textures[i].txdepth = tmp; | 1064 | track->textures[i].txdepth = tmp; |
1065 | track->tex_dirty = true; | ||
1046 | break; | 1066 | break; |
1047 | case R300_ZB_ZPASS_ADDR: | 1067 | case R300_ZB_ZPASS_ADDR: |
1048 | r = r100_cs_packet_next_reloc(p, &reloc); | 1068 | r = r100_cs_packet_next_reloc(p, &reloc); |
@@ -1057,6 +1077,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1057 | case 0x4e0c: | 1077 | case 0x4e0c: |
1058 | /* RB3D_COLOR_CHANNEL_MASK */ | 1078 | /* RB3D_COLOR_CHANNEL_MASK */ |
1059 | track->color_channel_mask = idx_value; | 1079 | track->color_channel_mask = idx_value; |
1080 | track->cb_dirty = true; | ||
1060 | break; | 1081 | break; |
1061 | case 0x43a4: | 1082 | case 0x43a4: |
1062 | /* SC_HYPERZ_EN */ | 1083 | /* SC_HYPERZ_EN */ |
@@ -1070,6 +1091,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1070 | case 0x4f1c: | 1091 | case 0x4f1c: |
1071 | /* ZB_BW_CNTL */ | 1092 | /* ZB_BW_CNTL */ |
1072 | track->zb_cb_clear = !!(idx_value & (1 << 5)); | 1093 | track->zb_cb_clear = !!(idx_value & (1 << 5)); |
1094 | track->cb_dirty = true; | ||
1095 | track->zb_dirty = true; | ||
1073 | if (p->rdev->hyperz_filp != p->filp) { | 1096 | if (p->rdev->hyperz_filp != p->filp) { |
1074 | if (idx_value & (R300_HIZ_ENABLE | | 1097 | if (idx_value & (R300_HIZ_ENABLE | |
1075 | R300_RD_COMP_ENABLE | | 1098 | R300_RD_COMP_ENABLE | |
@@ -1081,8 +1104,28 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1081 | case 0x4e04: | 1104 | case 0x4e04: |
1082 | /* RB3D_BLENDCNTL */ | 1105 | /* RB3D_BLENDCNTL */ |
1083 | track->blend_read_enable = !!(idx_value & (1 << 2)); | 1106 | track->blend_read_enable = !!(idx_value & (1 << 2)); |
1107 | track->cb_dirty = true; | ||
1108 | break; | ||
1109 | case R300_RB3D_AARESOLVE_OFFSET: | ||
1110 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
1111 | if (r) { | ||
1112 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", | ||
1113 | idx, reg); | ||
1114 | r100_cs_dump_packet(p, pkt); | ||
1115 | return r; | ||
1116 | } | ||
1117 | track->aa.robj = reloc->robj; | ||
1118 | track->aa.offset = idx_value; | ||
1119 | track->aa_dirty = true; | ||
1120 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); | ||
1121 | break; | ||
1122 | case R300_RB3D_AARESOLVE_PITCH: | ||
1123 | track->aa.pitch = idx_value & 0x3FFE; | ||
1124 | track->aa_dirty = true; | ||
1084 | break; | 1125 | break; |
1085 | case 0x4f28: /* ZB_DEPTHCLEARVALUE */ | 1126 | case R300_RB3D_AARESOLVE_CTL: |
1127 | track->aaresolve = idx_value & 0x1; | ||
1128 | track->aa_dirty = true; | ||
1086 | break; | 1129 | break; |
1087 | case 0x4f30: /* ZB_MASK_OFFSET */ | 1130 | case 0x4f30: /* ZB_MASK_OFFSET */ |
1088 | case 0x4f34: /* ZB_ZMASK_PITCH */ | 1131 | case 0x4f34: /* ZB_ZMASK_PITCH */ |