diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index ec97bad689f6..0b9621c9aeea 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1143,31 +1143,53 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1143 | } | 1143 | } |
| 1144 | 1144 | ||
| 1145 | if (tiling_flags & RADEON_TILING_MACRO) { | 1145 | if (tiling_flags & RADEON_TILING_MACRO) { |
| 1146 | if (rdev->family >= CHIP_BONAIRE) | 1146 | evergreen_tiling_fields(tiling_flags, &bankw, &bankh, &mtaspect, &tile_split); |
| 1147 | tmp = rdev->config.cik.tile_config; | ||
| 1148 | else if (rdev->family >= CHIP_TAHITI) | ||
| 1149 | tmp = rdev->config.si.tile_config; | ||
| 1150 | else if (rdev->family >= CHIP_CAYMAN) | ||
| 1151 | tmp = rdev->config.cayman.tile_config; | ||
| 1152 | else | ||
| 1153 | tmp = rdev->config.evergreen.tile_config; | ||
| 1154 | 1147 | ||
| 1155 | switch ((tmp & 0xf0) >> 4) { | 1148 | /* Set NUM_BANKS. */ |
| 1156 | case 0: /* 4 banks */ | 1149 | if (rdev->family >= CHIP_BONAIRE) { |
| 1157 | fb_format |= EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_4_BANK); | 1150 | unsigned tileb, index, num_banks, tile_split_bytes; |
| 1158 | break; | 1151 | |
| 1159 | case 1: /* 8 banks */ | 1152 | /* Calculate the macrotile mode index. */ |
| 1160 | default: | 1153 | tile_split_bytes = 64 << tile_split; |
| 1161 | fb_format |= EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_8_BANK); | 1154 | tileb = 8 * 8 * target_fb->bits_per_pixel / 8; |
| 1162 | break; | 1155 | tileb = min(tile_split_bytes, tileb); |
| 1163 | case 2: /* 16 banks */ | 1156 | |
| 1164 | fb_format |= EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_16_BANK); | 1157 | for (index = 0; tileb > 64; index++) { |
| 1165 | break; | 1158 | tileb >>= 1; |
| 1159 | } | ||
| 1160 | |||
| 1161 | if (index >= 16) { | ||
| 1162 | DRM_ERROR("Wrong screen bpp (%u) or tile split (%u)\n", | ||
| 1163 | target_fb->bits_per_pixel, tile_split); | ||
| 1164 | return -EINVAL; | ||
| 1165 | } | ||
| 1166 | |||
| 1167 | num_banks = (rdev->config.cik.macrotile_mode_array[index] >> 6) & 0x3; | ||
| 1168 | fb_format |= EVERGREEN_GRPH_NUM_BANKS(num_banks); | ||
| 1169 | } else { | ||
| 1170 | /* SI and older. */ | ||
| 1171 | if (rdev->family >= CHIP_TAHITI) | ||
| 1172 | tmp = rdev->config.si.tile_config; | ||
| 1173 | else if (rdev->family >= CHIP_CAYMAN) | ||
| 1174 | tmp = rdev->config.cayman.tile_config; | ||
| 1175 | else | ||
| 1176 | tmp = rdev->config.evergreen.tile_config; | ||
| 1177 | |||
| 1178 | switch ((tmp & 0xf0) >> 4) { | ||
| 1179 | case 0: /* 4 banks */ | ||
| 1180 | fb_format |= EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_4_BANK); | ||
| 1181 | break; | ||
| 1182 | case 1: /* 8 banks */ | ||
| 1183 | default: | ||
| 1184 | fb_format |= EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_8_BANK); | ||
| 1185 | break; | ||
| 1186 | case 2: /* 16 banks */ | ||
| 1187 | fb_format |= EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_16_BANK); | ||
| 1188 | break; | ||
| 1189 | } | ||
| 1166 | } | 1190 | } |
| 1167 | 1191 | ||
| 1168 | fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1); | 1192 | fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1); |
| 1169 | |||
| 1170 | evergreen_tiling_fields(tiling_flags, &bankw, &bankh, &mtaspect, &tile_split); | ||
| 1171 | fb_format |= EVERGREEN_GRPH_TILE_SPLIT(tile_split); | 1193 | fb_format |= EVERGREEN_GRPH_TILE_SPLIT(tile_split); |
| 1172 | fb_format |= EVERGREEN_GRPH_BANK_WIDTH(bankw); | 1194 | fb_format |= EVERGREEN_GRPH_BANK_WIDTH(bankw); |
| 1173 | fb_format |= EVERGREEN_GRPH_BANK_HEIGHT(bankh); | 1195 | fb_format |= EVERGREEN_GRPH_BANK_HEIGHT(bankh); |
