Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: convert SI,CIK to use sumo_rlc functions

and remove duplicate si_rlc functions.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+49 -195
+5 -5
drivers/gpu/drm/radeon/cik.c
··· 57 57 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save); 58 58 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save); 59 59 extern bool evergreen_is_display_hung(struct radeon_device *rdev); 60 + extern void sumo_rlc_fini(struct radeon_device *rdev); 61 + extern int sumo_rlc_init(struct radeon_device *rdev); 60 62 extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); 61 - extern void si_rlc_fini(struct radeon_device *rdev); 62 - extern int si_rlc_init(struct radeon_device *rdev); 63 63 extern void si_rlc_reset(struct radeon_device *rdev); 64 64 static void cik_rlc_stop(struct radeon_device *rdev); 65 65 static void cik_pcie_gen3_enable(struct radeon_device *rdev); ··· 6019 6019 cik_gpu_init(rdev); 6020 6020 6021 6021 /* allocate rlc buffers */ 6022 - r = si_rlc_init(rdev); 6022 + r = sumo_rlc_init(rdev); 6023 6023 if (r) { 6024 6024 DRM_ERROR("Failed to init rlc BOs!\n"); 6025 6025 return r; ··· 6343 6343 cik_cp_fini(rdev); 6344 6344 cik_sdma_fini(rdev); 6345 6345 cik_irq_fini(rdev); 6346 - si_rlc_fini(rdev); 6346 + sumo_rlc_fini(rdev); 6347 6347 cik_mec_fini(rdev); 6348 6348 radeon_wb_fini(rdev); 6349 6349 radeon_ib_pool_fini(rdev); ··· 6379 6379 cik_cp_fini(rdev); 6380 6380 cik_sdma_fini(rdev); 6381 6381 cik_irq_fini(rdev); 6382 - si_rlc_fini(rdev); 6382 + sumo_rlc_fini(rdev); 6383 6383 cik_mec_fini(rdev); 6384 6384 radeon_wb_fini(rdev); 6385 6385 radeon_vm_manager_fini(rdev);
+1 -1
drivers/gpu/drm/radeon/clearstate_cayman.h
··· 1073 1073 {SECT_CTRLCONST_def_1, 0x0000f3fc, 2 }, 1074 1074 { 0, 0, 0 } 1075 1075 }; 1076 - struct cs_section_def cayman_cs_data[] = { 1076 + static const struct cs_section_def cayman_cs_data[] = { 1077 1077 { SECT_CONTEXT_defs, SECT_CONTEXT }, 1078 1078 { SECT_CLEAR_defs, SECT_CLEAR }, 1079 1079 { SECT_CTRLCONST_defs, SECT_CTRLCONST },
+1 -1
drivers/gpu/drm/radeon/clearstate_evergreen.h
··· 1072 1072 {SECT_CTRLCONST_def_1, 0x0000f3fc, 2 }, 1073 1073 { 0, 0, 0 } 1074 1074 }; 1075 - struct cs_section_def evergreen_cs_data[] = { 1075 + static const struct cs_section_def evergreen_cs_data[] = { 1076 1076 { SECT_CONTEXT_defs, SECT_CONTEXT }, 1077 1077 { SECT_CLEAR_defs, SECT_CLEAR }, 1078 1078 { SECT_CTRLCONST_defs, SECT_CTRLCONST },
+26 -20
drivers/gpu/drm/radeon/evergreen.c
··· 47 47 48 48 #include "clearstate_evergreen.h" 49 49 50 - static u32 sumo_rlc_save_restore_register_list[] = 50 + static const u32 sumo_rlc_save_restore_register_list[] = 51 51 { 52 52 0x98fc, 53 53 0x9830, ··· 131 131 0x9150, 132 132 0x802c, 133 133 }; 134 - static u32 sumo_rlc_save_restore_register_list_size = ARRAY_SIZE(sumo_rlc_save_restore_register_list); 135 134 136 135 static void evergreen_gpu_init(struct radeon_device *rdev); 137 136 void evergreen_fini(struct radeon_device *rdev); ··· 3897 3898 3898 3899 int sumo_rlc_init(struct radeon_device *rdev) 3899 3900 { 3900 - u32 *src_ptr; 3901 + const u32 *src_ptr; 3901 3902 volatile u32 *dst_ptr; 3902 3903 u32 dws, data, i, j, k, reg_num; 3903 3904 u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index; 3904 3905 u64 reg_list_mc_addr; 3905 - struct cs_section_def *cs_data; 3906 + const struct cs_section_def *cs_data; 3906 3907 int r; 3907 3908 3908 3909 src_ptr = rdev->rlc.reg_list; ··· 3942 3943 } 3943 3944 /* write the sr buffer */ 3944 3945 dst_ptr = rdev->rlc.sr_ptr; 3945 - /* format: 3946 - * dw0: (reg2 << 16) | reg1 3947 - * dw1: reg1 save space 3948 - * dw2: reg2 save space 3949 - */ 3950 - for (i = 0; i < dws; i++) { 3951 - data = src_ptr[i] >> 2; 3952 - i++; 3953 - if (i < dws) 3954 - data |= (src_ptr[i] >> 2) << 16; 3955 - j = (((i - 1) * 3) / 2); 3956 - dst_ptr[j] = data; 3946 + if (rdev->family >= CHIP_TAHITI) { 3947 + /* SI */ 3948 + for (i = 0; i < dws; i++) 3949 + dst_ptr[i] = src_ptr[i]; 3950 + } else { 3951 + /* ON/LN/TN */ 3952 + /* format: 3953 + * dw0: (reg2 << 16) | reg1 3954 + * dw1: reg1 save space 3955 + * dw2: reg2 save space 3956 + */ 3957 + for (i = 0; i < dws; i++) { 3958 + data = src_ptr[i] >> 2; 3959 + i++; 3960 + if (i < dws) 3961 + data |= (src_ptr[i] >> 2) << 16; 3962 + j = (((i - 1) * 3) / 2); 3963 + dst_ptr[j] = data; 3964 + } 3965 + j = ((i * 3) / 2); 3966 + dst_ptr[j] = RLC_SAVE_RESTORE_LIST_END_MARKER; 3957 3967 } 3958 - j = ((i * 3) / 2); 3959 - dst_ptr[j] = RLC_SAVE_RESTORE_LIST_END_MARKER; 3960 - 3961 3968 radeon_bo_kunmap(rdev->rlc.save_restore_obj); 3962 3969 radeon_bo_unreserve(rdev->rlc.save_restore_obj); 3963 3970 } ··· 5157 5152 /* allocate rlc buffers */ 5158 5153 if (rdev->flags & RADEON_IS_IGP) { 5159 5154 rdev->rlc.reg_list = sumo_rlc_save_restore_register_list; 5160 - rdev->rlc.reg_list_size = sumo_rlc_save_restore_register_list_size; 5155 + rdev->rlc.reg_list_size = 5156 + (u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list); 5161 5157 rdev->rlc.cs_data = evergreen_cs_data; 5162 5158 r = sumo_rlc_init(rdev); 5163 5159 if (r) {
+3 -3
drivers/gpu/drm/radeon/ni.c
··· 35 35 #include "radeon_ucode.h" 36 36 #include "clearstate_cayman.h" 37 37 38 - static u32 tn_rlc_save_restore_register_list[] = 38 + static const u32 tn_rlc_save_restore_register_list[] = 39 39 { 40 40 0x98fc, 41 41 0x98f0, ··· 160 160 0x9830, 161 161 0x802c, 162 162 }; 163 - static u32 tn_rlc_save_restore_register_list_size = ARRAY_SIZE(tn_rlc_save_restore_register_list); 164 163 165 164 extern bool evergreen_is_display_hung(struct radeon_device *rdev); 166 165 extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); ··· 2120 2121 /* allocate rlc buffers */ 2121 2122 if (rdev->flags & RADEON_IS_IGP) { 2122 2123 rdev->rlc.reg_list = tn_rlc_save_restore_register_list; 2123 - rdev->rlc.reg_list_size = tn_rlc_save_restore_register_list_size; 2124 + rdev->rlc.reg_list_size = 2125 + (u32)ARRAY_SIZE(tn_rlc_save_restore_register_list); 2124 2126 rdev->rlc.cs_data = cayman_cs_data; 2125 2127 r = sumo_rlc_init(rdev); 2126 2128 if (r) {
+2 -2
drivers/gpu/drm/radeon/radeon.h
··· 854 854 struct radeon_bo *save_restore_obj; 855 855 uint64_t save_restore_gpu_addr; 856 856 volatile uint32_t *sr_ptr; 857 - u32 *reg_list; 857 + const u32 *reg_list; 858 858 u32 reg_list_size; 859 859 /* for clear state */ 860 860 struct radeon_bo *clear_state_obj; 861 861 uint64_t clear_state_gpu_addr; 862 862 volatile uint32_t *cs_ptr; 863 - struct cs_section_def *cs_data; 863 + const struct cs_section_def *cs_data; 864 864 }; 865 865 866 866 int radeon_ib_get(struct radeon_device *rdev, int ring,
+11 -163
drivers/gpu/drm/radeon/si.c
··· 68 68 69 69 static void si_pcie_gen3_enable(struct radeon_device *rdev); 70 70 static void si_program_aspm(struct radeon_device *rdev); 71 + extern void sumo_rlc_fini(struct radeon_device *rdev); 72 + extern int sumo_rlc_init(struct radeon_device *rdev); 71 73 extern int r600_ih_ring_alloc(struct radeon_device *rdev); 72 74 extern void r600_ih_ring_fini(struct radeon_device *rdev); 73 75 extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev); ··· 5277 5275 /* 5278 5276 * RLC 5279 5277 */ 5280 - void si_rlc_fini(struct radeon_device *rdev) 5281 - { 5282 - int r; 5283 - 5284 - /* save restore block */ 5285 - if (rdev->rlc.save_restore_obj) { 5286 - r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false); 5287 - if (unlikely(r != 0)) 5288 - dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r); 5289 - radeon_bo_unpin(rdev->rlc.save_restore_obj); 5290 - radeon_bo_unreserve(rdev->rlc.save_restore_obj); 5291 - 5292 - radeon_bo_unref(&rdev->rlc.save_restore_obj); 5293 - rdev->rlc.save_restore_obj = NULL; 5294 - } 5295 - 5296 - /* clear state block */ 5297 - if (rdev->rlc.clear_state_obj) { 5298 - r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false); 5299 - if (unlikely(r != 0)) 5300 - dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r); 5301 - radeon_bo_unpin(rdev->rlc.clear_state_obj); 5302 - radeon_bo_unreserve(rdev->rlc.clear_state_obj); 5303 - 5304 - radeon_bo_unref(&rdev->rlc.clear_state_obj); 5305 - rdev->rlc.clear_state_obj = NULL; 5306 - } 5307 - } 5308 - 5309 - #define RLC_CLEAR_STATE_END_MARKER 0x00000001 5310 - 5311 - int si_rlc_init(struct radeon_device *rdev) 5312 - { 5313 - volatile u32 *dst_ptr; 5314 - u32 dws, data, i, j, k, reg_num; 5315 - u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index; 5316 - u64 reg_list_mc_addr; 5317 - const struct cs_section_def *cs_data = si_cs_data; 5318 - int r; 5319 - 5320 - /* save restore block */ 5321 - if (rdev->rlc.save_restore_obj == NULL) { 5322 - r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true, 5323 - RADEON_GEM_DOMAIN_VRAM, NULL, 5324 - &rdev->rlc.save_restore_obj); 5325 - if (r) { 5326 - dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r); 5327 - return r; 5328 - } 5329 - } 5330 - 5331 - r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false); 5332 - if (unlikely(r != 0)) { 5333 - si_rlc_fini(rdev); 5334 - return r; 5335 - } 5336 - r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM, 5337 - &rdev->rlc.save_restore_gpu_addr); 5338 - if (r) { 5339 - radeon_bo_unreserve(rdev->rlc.save_restore_obj); 5340 - dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r); 5341 - si_rlc_fini(rdev); 5342 - return r; 5343 - } 5344 - 5345 - if (rdev->family == CHIP_VERDE) { 5346 - r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr); 5347 - if (r) { 5348 - dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r); 5349 - si_rlc_fini(rdev); 5350 - return r; 5351 - } 5352 - /* write the sr buffer */ 5353 - dst_ptr = rdev->rlc.sr_ptr; 5354 - for (i = 0; i < ARRAY_SIZE(verde_rlc_save_restore_register_list); i++) { 5355 - dst_ptr[i] = verde_rlc_save_restore_register_list[i]; 5356 - } 5357 - radeon_bo_kunmap(rdev->rlc.save_restore_obj); 5358 - } 5359 - radeon_bo_unreserve(rdev->rlc.save_restore_obj); 5360 - 5361 - /* clear state block */ 5362 - reg_list_num = 0; 5363 - dws = 0; 5364 - for (i = 0; cs_data[i].section != NULL; i++) { 5365 - for (j = 0; cs_data[i].section[j].extent != NULL; j++) { 5366 - reg_list_num++; 5367 - dws += cs_data[i].section[j].reg_count; 5368 - } 5369 - } 5370 - reg_list_blk_index = (3 * reg_list_num + 2); 5371 - dws += reg_list_blk_index; 5372 - 5373 - if (rdev->rlc.clear_state_obj == NULL) { 5374 - r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, 5375 - RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.clear_state_obj); 5376 - if (r) { 5377 - dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r); 5378 - si_rlc_fini(rdev); 5379 - return r; 5380 - } 5381 - } 5382 - r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false); 5383 - if (unlikely(r != 0)) { 5384 - si_rlc_fini(rdev); 5385 - return r; 5386 - } 5387 - r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM, 5388 - &rdev->rlc.clear_state_gpu_addr); 5389 - if (r) { 5390 - 5391 - radeon_bo_unreserve(rdev->rlc.clear_state_obj); 5392 - dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r); 5393 - si_rlc_fini(rdev); 5394 - return r; 5395 - } 5396 - r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr); 5397 - if (r) { 5398 - dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r); 5399 - si_rlc_fini(rdev); 5400 - return r; 5401 - } 5402 - /* set up the cs buffer */ 5403 - dst_ptr = rdev->rlc.cs_ptr; 5404 - reg_list_hdr_blk_index = 0; 5405 - reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4); 5406 - data = upper_32_bits(reg_list_mc_addr); 5407 - dst_ptr[reg_list_hdr_blk_index] = data; 5408 - reg_list_hdr_blk_index++; 5409 - for (i = 0; cs_data[i].section != NULL; i++) { 5410 - for (j = 0; cs_data[i].section[j].extent != NULL; j++) { 5411 - reg_num = cs_data[i].section[j].reg_count; 5412 - data = reg_list_mc_addr & 0xffffffff; 5413 - dst_ptr[reg_list_hdr_blk_index] = data; 5414 - reg_list_hdr_blk_index++; 5415 - 5416 - data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff; 5417 - dst_ptr[reg_list_hdr_blk_index] = data; 5418 - reg_list_hdr_blk_index++; 5419 - 5420 - data = 0x08000000 | (reg_num * 4); 5421 - dst_ptr[reg_list_hdr_blk_index] = data; 5422 - reg_list_hdr_blk_index++; 5423 - 5424 - for (k = 0; k < reg_num; k++) { 5425 - data = cs_data[i].section[j].extent[k]; 5426 - dst_ptr[reg_list_blk_index + k] = data; 5427 - } 5428 - reg_list_mc_addr += reg_num * 4; 5429 - reg_list_blk_index += reg_num; 5430 - } 5431 - } 5432 - dst_ptr[reg_list_hdr_blk_index] = RLC_CLEAR_STATE_END_MARKER; 5433 - 5434 - radeon_bo_kunmap(rdev->rlc.clear_state_obj); 5435 - radeon_bo_unreserve(rdev->rlc.clear_state_obj); 5436 - 5437 - return 0; 5438 - } 5439 - 5440 5278 void si_rlc_reset(struct radeon_device *rdev) 5441 5279 { 5442 5280 u32 tmp = RREG32(GRBM_SOFT_RESET); ··· 6291 6449 si_gpu_init(rdev); 6292 6450 6293 6451 /* allocate rlc buffers */ 6294 - r = si_rlc_init(rdev); 6452 + if (rdev->family == CHIP_VERDE) { 6453 + rdev->rlc.reg_list = verde_rlc_save_restore_register_list; 6454 + rdev->rlc.reg_list_size = 6455 + (u32)ARRAY_SIZE(verde_rlc_save_restore_register_list); 6456 + } 6457 + rdev->rlc.cs_data = si_cs_data; 6458 + r = sumo_rlc_init(rdev); 6295 6459 if (r) { 6296 6460 DRM_ERROR("Failed to init rlc BOs!\n"); 6297 6461 return r; ··· 6583 6735 si_cp_fini(rdev); 6584 6736 cayman_dma_fini(rdev); 6585 6737 si_irq_fini(rdev); 6586 - si_rlc_fini(rdev); 6738 + sumo_rlc_fini(rdev); 6587 6739 radeon_wb_fini(rdev); 6588 6740 radeon_ib_pool_fini(rdev); 6589 6741 radeon_vm_manager_fini(rdev); ··· 6609 6761 si_cp_fini(rdev); 6610 6762 cayman_dma_fini(rdev); 6611 6763 si_irq_fini(rdev); 6612 - si_rlc_fini(rdev); 6764 + sumo_rlc_fini(rdev); 6613 6765 si_fini_cg(rdev); 6614 6766 si_fini_pg(rdev); 6615 6767 radeon_wb_fini(rdev);