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

Merge branch 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux into drm-next

Some amdgpu/ttm fixes.

* 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux:
drm/amd/powerplay: wrong control mode cause the fan spins faster unnecessarily
drm/amd/powerplay: fix memory leak of hardcoded pptable
drm/amdgpu:add fw-vram-usage for atomfirmware
drm/radeon: fix atombios on big endian
drm/ttm:fix memory leak due to individualize
drm/amdgpu: fix error handling in amdgpu_bo_do_create
drm/ttm: once more fix ttm_buffer_object_transfer
drm/amd/powerplay: change ASIC temperature reading on Vega10

+68 -51
+18 -20
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
··· 1766 1766 return true; 1767 1767 } 1768 1768 1769 - /* Atom needs data in little endian format 1770 - * so swap as appropriate when copying data to 1771 - * or from atom. Note that atom operates on 1772 - * dw units. 1769 + /* Atom needs data in little endian format so swap as appropriate when copying 1770 + * data to or from atom. Note that atom operates on dw units. 1771 + * 1772 + * Use to_le=true when sending data to atom and provide at least 1773 + * ALIGN(num_bytes,4) bytes in the dst buffer. 1774 + * 1775 + * Use to_le=false when receiving data from atom and provide ALIGN(num_bytes,4) 1776 + * byes in the src buffer. 1773 1777 */ 1774 1778 void amdgpu_atombios_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le) 1775 1779 { 1776 1780 #ifdef __BIG_ENDIAN 1777 - u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */ 1778 - u32 *dst32, *src32; 1781 + u32 src_tmp[5], dst_tmp[5]; 1779 1782 int i; 1783 + u8 align_num_bytes = ALIGN(num_bytes, 4); 1780 1784 1781 - memcpy(src_tmp, src, num_bytes); 1782 - src32 = (u32 *)src_tmp; 1783 - dst32 = (u32 *)dst_tmp; 1784 1785 if (to_le) { 1785 - for (i = 0; i < ((num_bytes + 3) / 4); i++) 1786 - dst32[i] = cpu_to_le32(src32[i]); 1787 - memcpy(dst, dst_tmp, num_bytes); 1786 + memcpy(src_tmp, src, num_bytes); 1787 + for (i = 0; i < align_num_bytes / 4; i++) 1788 + dst_tmp[i] = cpu_to_le32(src_tmp[i]); 1789 + memcpy(dst, dst_tmp, align_num_bytes); 1788 1790 } else { 1789 - u8 dws = num_bytes & ~3; 1790 - for (i = 0; i < ((num_bytes + 3) / 4); i++) 1791 - dst32[i] = le32_to_cpu(src32[i]); 1792 - memcpy(dst, dst_tmp, dws); 1793 - if (num_bytes % 4) { 1794 - for (i = 0; i < (num_bytes % 4); i++) 1795 - dst[dws+i] = dst_tmp[dws+i]; 1796 - } 1791 + memcpy(src_tmp, src, align_num_bytes); 1792 + for (i = 0; i < align_num_bytes / 4; i++) 1793 + dst_tmp[i] = le32_to_cpu(src_tmp[i]); 1794 + memcpy(dst, dst_tmp, num_bytes); 1797 1795 } 1798 1796 #else 1799 1797 memcpy(dst, src, num_bytes);
+18 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
··· 71 71 struct atom_context *ctx = adev->mode_info.atom_context; 72 72 int index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, 73 73 vram_usagebyfirmware); 74 + struct vram_usagebyfirmware_v2_1 * firmware_usage; 75 + uint32_t start_addr, size; 74 76 uint16_t data_offset; 75 77 int usage_bytes = 0; 76 78 77 79 if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset)) { 78 - struct vram_usagebyfirmware_v2_1 *firmware_usage = 79 - (struct vram_usagebyfirmware_v2_1 *)(ctx->bios + data_offset); 80 - 80 + firmware_usage = (struct vram_usagebyfirmware_v2_1 *)(ctx->bios + data_offset); 81 81 DRM_DEBUG("atom firmware requested %08x %dkb fw %dkb drv\n", 82 82 le32_to_cpu(firmware_usage->start_address_in_kb), 83 83 le16_to_cpu(firmware_usage->used_by_firmware_in_kb), 84 84 le16_to_cpu(firmware_usage->used_by_driver_in_kb)); 85 85 86 - usage_bytes = le16_to_cpu(firmware_usage->used_by_driver_in_kb) * 1024; 86 + start_addr = le32_to_cpu(firmware_usage->start_address_in_kb); 87 + size = le16_to_cpu(firmware_usage->used_by_firmware_in_kb); 88 + 89 + if ((uint32_t)(start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) == 90 + (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION << 91 + ATOM_VRAM_OPERATION_FLAGS_SHIFT)) { 92 + /* Firmware request VRAM reservation for SR-IOV */ 93 + adev->fw_vram_usage.start_offset = (start_addr & 94 + (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10; 95 + adev->fw_vram_usage.size = size << 10; 96 + /* Use the default scratch size */ 97 + usage_bytes = 0; 98 + } else { 99 + usage_bytes = le16_to_cpu(firmware_usage->used_by_driver_in_kb) << 10; 100 + } 87 101 } 88 102 ctx->scratch_size_bytes = 0; 89 103 if (usage_bytes == 0)
+3 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 369 369 r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, type, 370 370 &bo->placement, page_align, !kernel, NULL, 371 371 acc_size, sg, resv, &amdgpu_ttm_bo_destroy); 372 + if (unlikely(r != 0)) 373 + return r; 374 + 372 375 bytes_moved = atomic64_read(&adev->num_bytes_moved) - 373 376 initial_bytes_moved; 374 377 if (adev->mc.visible_vram_size < adev->mc.real_vram_size && ··· 380 377 amdgpu_cs_report_moved_bytes(adev, bytes_moved, bytes_moved); 381 378 else 382 379 amdgpu_cs_report_moved_bytes(adev, bytes_moved, 0); 383 - 384 - if (unlikely(r != 0)) 385 - return r; 386 380 387 381 if (kernel) 388 382 bo->tbo.priority = 1;
+3
drivers/gpu/drm/amd/powerplay/amd_powerplay.c
··· 78 78 { 79 79 struct pp_instance *instance = (struct pp_instance *)handle; 80 80 81 + kfree(instance->hwmgr->hardcode_pp_table); 82 + instance->hwmgr->hardcode_pp_table = NULL; 83 + 81 84 kfree(instance->hwmgr); 82 85 instance->hwmgr = NULL; 83 86
+1 -1
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
··· 4234 4234 vega10_fan_ctrl_stop_smc_fan_control(hwmgr); 4235 4235 break; 4236 4236 case AMD_FAN_CTRL_AUTO: 4237 - if (!vega10_fan_ctrl_set_static_mode(hwmgr, mode)) 4237 + if (PP_CAP(PHM_PlatformCaps_MicrocodeFanControl)) 4238 4238 vega10_fan_ctrl_start_smc_fan_control(hwmgr); 4239 4239 break; 4240 4240 default:
+2 -2
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c
··· 365 365 366 366 temp = cgs_read_register(hwmgr->device, reg); 367 367 368 - temp = (temp & CG_MULT_THERMAL_STATUS__ASIC_MAX_TEMP_MASK) >> 369 - CG_MULT_THERMAL_STATUS__ASIC_MAX_TEMP__SHIFT; 368 + temp = (temp & CG_MULT_THERMAL_STATUS__CTF_TEMP_MASK) >> 369 + CG_MULT_THERMAL_STATUS__CTF_TEMP__SHIFT; 370 370 371 371 temp = temp & 0x1ff; 372 372
+18 -20
drivers/gpu/drm/radeon/atombios_dp.c
··· 45 45 46 46 /***** radeon AUX functions *****/ 47 47 48 - /* Atom needs data in little endian format 49 - * so swap as appropriate when copying data to 50 - * or from atom. Note that atom operates on 51 - * dw units. 48 + /* Atom needs data in little endian format so swap as appropriate when copying 49 + * data to or from atom. Note that atom operates on dw units. 50 + * 51 + * Use to_le=true when sending data to atom and provide at least 52 + * ALIGN(num_bytes,4) bytes in the dst buffer. 53 + * 54 + * Use to_le=false when receiving data from atom and provide ALIGN(num_bytes,4) 55 + * byes in the src buffer. 52 56 */ 53 57 void radeon_atom_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le) 54 58 { 55 59 #ifdef __BIG_ENDIAN 56 - u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */ 57 - u32 *dst32, *src32; 60 + u32 src_tmp[5], dst_tmp[5]; 58 61 int i; 62 + u8 align_num_bytes = ALIGN(num_bytes, 4); 59 63 60 - memcpy(src_tmp, src, num_bytes); 61 - src32 = (u32 *)src_tmp; 62 - dst32 = (u32 *)dst_tmp; 63 64 if (to_le) { 64 - for (i = 0; i < ((num_bytes + 3) / 4); i++) 65 - dst32[i] = cpu_to_le32(src32[i]); 66 - memcpy(dst, dst_tmp, num_bytes); 65 + memcpy(src_tmp, src, num_bytes); 66 + for (i = 0; i < align_num_bytes / 4; i++) 67 + dst_tmp[i] = cpu_to_le32(src_tmp[i]); 68 + memcpy(dst, dst_tmp, align_num_bytes); 67 69 } else { 68 - u8 dws = num_bytes & ~3; 69 - for (i = 0; i < ((num_bytes + 3) / 4); i++) 70 - dst32[i] = le32_to_cpu(src32[i]); 71 - memcpy(dst, dst_tmp, dws); 72 - if (num_bytes % 4) { 73 - for (i = 0; i < (num_bytes % 4); i++) 74 - dst[dws+i] = dst_tmp[dws+i]; 75 - } 70 + memcpy(src_tmp, src, align_num_bytes); 71 + for (i = 0; i < align_num_bytes / 4; i++) 72 + dst_tmp[i] = le32_to_cpu(src_tmp[i]); 73 + memcpy(dst, dst_tmp, num_bytes); 76 74 } 77 75 #else 78 76 memcpy(dst, src, num_bytes);
+4 -1
drivers/gpu/drm/ttm/ttm_bo.c
··· 457 457 if (reservation_object_test_signaled_rcu(&bo->ttm_resv, true)) { 458 458 ttm_bo_del_from_lru(bo); 459 459 spin_unlock(&glob->lru_lock); 460 - if (bo->resv != &bo->ttm_resv) 460 + if (bo->resv != &bo->ttm_resv) { 461 461 reservation_object_unlock(&bo->ttm_resv); 462 + reservation_object_fini(&bo->ttm_resv); 463 + } 464 + 462 465 ttm_bo_cleanup_memtype_use(bo); 463 466 return; 464 467 }
+1
drivers/gpu/drm/ttm/ttm_bo_util.c
··· 474 474 INIT_LIST_HEAD(&fbo->lru); 475 475 INIT_LIST_HEAD(&fbo->swap); 476 476 INIT_LIST_HEAD(&fbo->io_reserve_lru); 477 + mutex_init(&fbo->wu_mutex); 477 478 fbo->moving = NULL; 478 479 drm_vma_node_reset(&fbo->vma_node); 479 480 atomic_set(&fbo->cpu_writers, 0);