aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3687-drm-amd-pp-Delete-the-wrapper-layer-of-smu_allocate-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3687-drm-amd-pp-Delete-the-wrapper-layer-of-smu_allocate-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3687-drm-amd-pp-Delete-the-wrapper-layer-of-smu_allocate-.patch924
1 files changed, 924 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3687-drm-amd-pp-Delete-the-wrapper-layer-of-smu_allocate-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3687-drm-amd-pp-Delete-the-wrapper-layer-of-smu_allocate-.patch
new file mode 100644
index 00000000..75c31ecb
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3687-drm-amd-pp-Delete-the-wrapper-layer-of-smu_allocate-.patch
@@ -0,0 +1,924 @@
+From 96b8b25161f8083e5b833f17fbe16a459e252e82 Mon Sep 17 00:00:00 2001
+From: Rex Zhu <Rex.Zhu@amd.com>
+Date: Tue, 6 Mar 2018 13:13:21 +0800
+Subject: [PATCH 3687/4131] drm/amd/pp: Delete the wrapper layer of
+ smu_allocate/free_memory
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+use amdgpu_bo_create/free_kernel instand.
+
+Change-Id: I477d6aa834cfee9a8f02540fd5987fa955930ad7
+Reviewed-by: Alex Deucher <alexdeucher@amd.com>
+Acked-by: Christian König <christian.koenig@amd.com>
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/inc/smumgr.h | 7 -
+ drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c | 84 ++++-----
+ drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.h | 5 +-
+ drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c | 71 ++++----
+ drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h | 7 +-
+ drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c | 64 ++++---
+ drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h | 5 +-
+ drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c | 51 ------
+ .../gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c | 195 +++++++++------------
+ .../gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h | 7 +-
+ 10 files changed, 195 insertions(+), 301 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/smumgr.h b/drivers/gpu/drm/amd/powerplay/inc/smumgr.h
+index e1f6e83..8872c5c 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/smumgr.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/smumgr.h
+@@ -106,13 +106,6 @@ extern int smum_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg);
+ extern int smum_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
+ uint16_t msg, uint32_t parameter);
+
+-extern int smu_allocate_memory(void *device, uint32_t size,
+- enum cgs_gpu_mem_type type,
+- uint32_t byte_align, uint64_t *mc_addr,
+- void **kptr, void *handle);
+-
+-extern int smu_free_memory(void *device, void *handle);
+-
+ extern int smum_update_sclk_threshold(struct pp_hwmgr *hwmgr);
+
+ extern int smum_update_smc_table(struct pp_hwmgr *hwmgr, uint32_t type);
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
+index 7fe4c11..df58539 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
+@@ -347,8 +347,8 @@ static int cz_smu_populate_single_scratch_task(
+ return -EINVAL;
+ }
+
+- task->addr.low = cz_smu->scratch_buffer[i].mc_addr_low;
+- task->addr.high = cz_smu->scratch_buffer[i].mc_addr_high;
++ task->addr.low = smu_lower_32_bits(cz_smu->scratch_buffer[i].mc_addr);
++ task->addr.high = smu_upper_32_bits(cz_smu->scratch_buffer[i].mc_addr);
+ task->size_bytes = cz_smu->scratch_buffer[i].data_size;
+
+ if (CZ_SCRATCH_ENTRY_DATA_ID_IH_REGISTERS == fw_enum) {
+@@ -384,8 +384,8 @@ static int cz_smu_populate_single_ucode_load_task(
+ return -EINVAL;
+ }
+
+- task->addr.low = cz_smu->driver_buffer[i].mc_addr_low;
+- task->addr.high = cz_smu->driver_buffer[i].mc_addr_high;
++ task->addr.low = smu_lower_32_bits(cz_smu->driver_buffer[i].mc_addr);
++ task->addr.high = smu_upper_32_bits(cz_smu->driver_buffer[i].mc_addr);
+ task->size_bytes = cz_smu->driver_buffer[i].data_size;
+
+ return 0;
+@@ -566,11 +566,7 @@ static int cz_smu_populate_firmware_entries(struct pp_hwmgr *hwmgr)
+ ucode_id, &info);
+
+ if (ret == 0) {
+- cz_smu->driver_buffer[i].mc_addr_high =
+- smu_upper_32_bits(info.mc_addr);
+-
+- cz_smu->driver_buffer[i].mc_addr_low =
+- smu_lower_32_bits(info.mc_addr);
++ cz_smu->driver_buffer[i].mc_addr = info.mc_addr;
+
+ cz_smu->driver_buffer[i].data_size = info.image_size;
+
+@@ -589,19 +585,12 @@ static int cz_smu_populate_single_scratch_entry(
+ struct cz_buffer_entry *entry)
+ {
+ struct cz_smumgr *cz_smu = (struct cz_smumgr *)hwmgr->smu_backend;
+- long long mc_addr =
+- ((long long)(cz_smu->smu_buffer.mc_addr_high) << 32)
+- | cz_smu->smu_buffer.mc_addr_low;
+-
+ uint32_t ulsize_aligned = SIZE_ALIGN_32(ulsize_byte);
+
+- mc_addr += cz_smu->smu_buffer_used_bytes;
+-
+ entry->data_size = ulsize_byte;
+ entry->kaddr = (char *) cz_smu->smu_buffer.kaddr +
+ cz_smu->smu_buffer_used_bytes;
+- entry->mc_addr_low = smu_lower_32_bits(mc_addr);
+- entry->mc_addr_high = smu_upper_32_bits(mc_addr);
++ entry->mc_addr = cz_smu->smu_buffer.mc_addr + cz_smu->smu_buffer_used_bytes;
+ entry->firmware_ID = scratch_type;
+
+ cz_smu->smu_buffer_used_bytes += ulsize_aligned;
+@@ -624,11 +613,11 @@ static int cz_download_pptable_settings(struct pp_hwmgr *hwmgr, void **table)
+
+ cz_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetClkTableAddrHi,
+- cz_smu->scratch_buffer[i].mc_addr_high);
++ smu_upper_32_bits(cz_smu->scratch_buffer[i].mc_addr));
+
+ cz_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetClkTableAddrLo,
+- cz_smu->scratch_buffer[i].mc_addr_low);
++ smu_lower_32_bits(cz_smu->scratch_buffer[i].mc_addr));
+
+ cz_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ExecuteJob,
+ cz_smu->toc_entry_clock_table);
+@@ -651,11 +640,11 @@ static int cz_upload_pptable_settings(struct pp_hwmgr *hwmgr)
+
+ cz_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetClkTableAddrHi,
+- cz_smu->scratch_buffer[i].mc_addr_high);
++ smu_upper_32_bits(cz_smu->scratch_buffer[i].mc_addr));
+
+ cz_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetClkTableAddrLo,
+- cz_smu->scratch_buffer[i].mc_addr_low);
++ smu_lower_32_bits(cz_smu->scratch_buffer[i].mc_addr));
+
+ cz_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ExecuteJob,
+ cz_smu->toc_entry_clock_table);
+@@ -686,11 +675,11 @@ static int cz_request_smu_load_fw(struct pp_hwmgr *hwmgr)
+
+ cz_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_DriverDramAddrHi,
+- cz_smu->toc_buffer.mc_addr_high);
++ smu_upper_32_bits(cz_smu->toc_buffer.mc_addr));
+
+ cz_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_DriverDramAddrLo,
+- cz_smu->toc_buffer.mc_addr_low);
++ smu_lower_32_bits(cz_smu->toc_buffer.mc_addr));
+
+ cz_send_msg_to_smc(hwmgr, PPSMC_MSG_InitJobs);
+
+@@ -750,7 +739,6 @@ static int cz_start_smu(struct pp_hwmgr *hwmgr)
+
+ static int cz_smu_init(struct pp_hwmgr *hwmgr)
+ {
+- uint64_t mc_addr = 0;
+ int ret = 0;
+ struct cz_smumgr *cz_smu;
+
+@@ -768,31 +756,29 @@ static int cz_smu_init(struct pp_hwmgr *hwmgr)
+ ALIGN(sizeof(struct SMU8_MultimediaPowerLogData), 32) +
+ ALIGN(sizeof(struct SMU8_Fusion_ClkTable), 32);
+
+- ret = smu_allocate_memory(hwmgr->device,
++ ret = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ cz_smu->toc_buffer.data_size,
+- CGS_GPU_MEM_TYPE__GART_CACHEABLE,
+ PAGE_SIZE,
+- &mc_addr,
+- &cz_smu->toc_buffer.kaddr,
+- &cz_smu->toc_buffer.handle);
+- if (ret != 0)
+- return -1;
+-
+- cz_smu->toc_buffer.mc_addr_high = smu_upper_32_bits(mc_addr);
+- cz_smu->toc_buffer.mc_addr_low = smu_lower_32_bits(mc_addr);
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &cz_smu->toc_buffer.handle,
++ &cz_smu->toc_buffer.mc_addr,
++ &cz_smu->toc_buffer.kaddr);
++ if (ret)
++ return -EINVAL;
+
+- ret = smu_allocate_memory(hwmgr->device,
++ ret = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ cz_smu->smu_buffer.data_size,
+- CGS_GPU_MEM_TYPE__GART_CACHEABLE,
+ PAGE_SIZE,
+- &mc_addr,
+- &cz_smu->smu_buffer.kaddr,
+- &cz_smu->smu_buffer.handle);
+- if (ret != 0)
+- return -1;
+-
+- cz_smu->smu_buffer.mc_addr_high = smu_upper_32_bits(mc_addr);
+- cz_smu->smu_buffer.mc_addr_low = smu_lower_32_bits(mc_addr);
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &cz_smu->smu_buffer.handle,
++ &cz_smu->smu_buffer.mc_addr,
++ &cz_smu->smu_buffer.kaddr);
++ if (ret) {
++ amdgpu_bo_free_kernel(&cz_smu->toc_buffer.handle,
++ &cz_smu->toc_buffer.mc_addr,
++ &cz_smu->toc_buffer.kaddr);
++ return -EINVAL;
++ }
+
+ if (0 != cz_smu_populate_single_scratch_entry(hwmgr,
+ CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SCRATCH,
+@@ -845,10 +831,12 @@ static int cz_smu_fini(struct pp_hwmgr *hwmgr)
+
+ cz_smu = (struct cz_smumgr *)hwmgr->smu_backend;
+ if (cz_smu) {
+- cgs_free_gpu_mem(hwmgr->device,
+- cz_smu->toc_buffer.handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- cz_smu->smu_buffer.handle);
++ amdgpu_bo_free_kernel(&cz_smu->toc_buffer.handle,
++ &cz_smu->toc_buffer.mc_addr,
++ &cz_smu->toc_buffer.kaddr);
++ amdgpu_bo_free_kernel(&cz_smu->smu_buffer.handle,
++ &cz_smu->smu_buffer.mc_addr,
++ &cz_smu->smu_buffer.kaddr);
+ kfree(cz_smu);
+ }
+
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.h
+index 756b2c4..c13ab83 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.h
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.h
+@@ -60,11 +60,10 @@ enum cz_scratch_entry {
+
+ struct cz_buffer_entry {
+ uint32_t data_size;
+- uint32_t mc_addr_low;
+- uint32_t mc_addr_high;
++ uint64_t mc_addr;
+ void *kaddr;
+ enum cz_scratch_entry firmware_ID;
+- unsigned long handle; /* as bo handle used when release bo */
++ struct amdgpu_bo *handle; /* as bo handle used when release bo */
+ };
+
+ struct cz_register_index_data_pair {
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c
+index 2d662b4..9a0aedb 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c
+@@ -169,11 +169,11 @@ int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr,
+ "Invalid SMU Table Length!", return -EINVAL;);
+ PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetDriverDramAddrHigh,
+- priv->smu_tables.entry[table_id].table_addr_high) == 0,
++ smu_upper_32_bits(priv->smu_tables.entry[table_id].mc_addr)) == 0,
+ "[CopyTableFromSMC] Attempt to Set Dram Addr High Failed!", return -EINVAL;);
+ PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetDriverDramAddrLow,
+- priv->smu_tables.entry[table_id].table_addr_low) == 0,
++ smu_lower_32_bits(priv->smu_tables.entry[table_id].mc_addr)) == 0,
+ "[CopyTableFromSMC] Attempt to Set Dram Addr Low Failed!",
+ return -EINVAL;);
+ PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
+@@ -182,7 +182,7 @@ int rv_copy_table_from_smc(struct pp_hwmgr *hwmgr,
+ "[CopyTableFromSMC] Attempt to Transfer Table From SMU Failed!",
+ return -EINVAL;);
+
+- memcpy(table, priv->smu_tables.entry[table_id].table,
++ memcpy(table, (uint8_t *)priv->smu_tables.entry[table_id].table,
+ priv->smu_tables.entry[table_id].size);
+
+ return 0;
+@@ -206,12 +206,12 @@ int rv_copy_table_to_smc(struct pp_hwmgr *hwmgr,
+
+ PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetDriverDramAddrHigh,
+- priv->smu_tables.entry[table_id].table_addr_high) == 0,
++ smu_upper_32_bits(priv->smu_tables.entry[table_id].mc_addr)) == 0,
+ "[CopyTableToSMC] Attempt to Set Dram Addr High Failed!",
+ return -EINVAL;);
+ PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetDriverDramAddrLow,
+- priv->smu_tables.entry[table_id].table_addr_low) == 0,
++ smu_lower_32_bits(priv->smu_tables.entry[table_id].mc_addr)) == 0,
+ "[CopyTableToSMC] Attempt to Set Dram Addr Low Failed!",
+ return -EINVAL;);
+ PP_ASSERT_WITH_CODE(rv_send_msg_to_smc_with_parameter(hwmgr,
+@@ -292,10 +292,12 @@ static int rv_smu_fini(struct pp_hwmgr *hwmgr)
+ if (priv) {
+ rv_smc_disable_sdma(hwmgr);
+ rv_smc_disable_vcn(hwmgr);
+- cgs_free_gpu_mem(hwmgr->device,
+- priv->smu_tables.entry[WMTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- priv->smu_tables.entry[CLOCKTABLE].handle);
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[WMTABLE].handle,
++ &priv->smu_tables.entry[WMTABLE].mc_addr,
++ priv->smu_tables.entry[WMTABLE].table);
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[CLOCKTABLE].handle,
++ &priv->smu_tables.entry[CLOCKTABLE].mc_addr,
++ priv->smu_tables.entry[CLOCKTABLE].table);
+ kfree(hwmgr->smu_backend);
+ hwmgr->smu_backend = NULL;
+ }
+@@ -328,7 +330,8 @@ static int rv_smu_init(struct pp_hwmgr *hwmgr)
+ struct rv_smumgr *priv;
+ uint64_t mc_addr;
+ void *kaddr = NULL;
+- unsigned long handle;
++ struct amdgpu_bo *handle;
++ int r;
+
+ priv = kzalloc(sizeof(struct rv_smumgr), GFP_KERNEL);
+
+@@ -338,54 +341,44 @@ static int rv_smu_init(struct pp_hwmgr *hwmgr)
+ hwmgr->smu_backend = priv;
+
+ /* allocate space for watermarks table */
+- smu_allocate_memory(hwmgr->device,
++ r = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ sizeof(Watermarks_t),
+- CGS_GPU_MEM_TYPE__GART_CACHEABLE,
+ PAGE_SIZE,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &handle,
+ &mc_addr,
+- &kaddr,
+- &handle);
++ &kaddr);
+
+- PP_ASSERT_WITH_CODE(kaddr,
+- "[rv_smu_init] Out of memory for wmtable.",
+- kfree(hwmgr->smu_backend);
+- hwmgr->smu_backend = NULL;
+- return -EINVAL);
++ if (r)
++ return -EINVAL;
+
+ priv->smu_tables.entry[WMTABLE].version = 0x01;
+ priv->smu_tables.entry[WMTABLE].size = sizeof(Watermarks_t);
+ priv->smu_tables.entry[WMTABLE].table_id = TABLE_WATERMARKS;
+- priv->smu_tables.entry[WMTABLE].table_addr_high =
+- smu_upper_32_bits(mc_addr);
+- priv->smu_tables.entry[WMTABLE].table_addr_low =
+- smu_lower_32_bits(mc_addr);
++ priv->smu_tables.entry[WMTABLE].mc_addr = mc_addr;
+ priv->smu_tables.entry[WMTABLE].table = kaddr;
+ priv->smu_tables.entry[WMTABLE].handle = handle;
+
+ /* allocate space for watermarks table */
+- smu_allocate_memory(hwmgr->device,
++ r = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ sizeof(DpmClocks_t),
+- CGS_GPU_MEM_TYPE__GART_CACHEABLE,
+ PAGE_SIZE,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &handle,
+ &mc_addr,
+- &kaddr,
+- &handle);
+-
+- PP_ASSERT_WITH_CODE(kaddr,
+- "[rv_smu_init] Out of memory for CLOCKTABLE.",
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
+- kfree(hwmgr->smu_backend);
+- hwmgr->smu_backend = NULL;
+- return -EINVAL);
++ &kaddr);
++
++ if (r) {
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[WMTABLE].handle,
++ &priv->smu_tables.entry[WMTABLE].mc_addr,
++ &priv->smu_tables.entry[WMTABLE].table);
++ return -EINVAL;
++ }
+
+ priv->smu_tables.entry[CLOCKTABLE].version = 0x01;
+ priv->smu_tables.entry[CLOCKTABLE].size = sizeof(DpmClocks_t);
+ priv->smu_tables.entry[CLOCKTABLE].table_id = TABLE_DPMCLOCKS;
+- priv->smu_tables.entry[CLOCKTABLE].table_addr_high =
+- smu_upper_32_bits(mc_addr);
+- priv->smu_tables.entry[CLOCKTABLE].table_addr_low =
+- smu_lower_32_bits(mc_addr);
++ priv->smu_tables.entry[CLOCKTABLE].mc_addr = mc_addr;
+ priv->smu_tables.entry[CLOCKTABLE].table = kaddr;
+ priv->smu_tables.entry[CLOCKTABLE].handle = handle;
+
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h
+index caebdbe..0ff4ac5 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h
+@@ -37,10 +37,9 @@ struct smu_table_entry {
+ uint32_t version;
+ uint32_t size;
+ uint32_t table_id;
+- uint32_t table_addr_high;
+- uint32_t table_addr_low;
+- uint8_t *table;
+- unsigned long handle;
++ uint64_t mc_addr;
++ void *table;
++ struct amdgpu_bo *handle;
+ };
+
+ struct smu_table_array {
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
+index 311ff37..92dd4bc 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
+@@ -412,10 +412,10 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr)
+ if (!cgs_is_virtualization_enabled(hwmgr->device)) {
+ smu7_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SMU_DRAM_ADDR_HI,
+- smu_data->smu_buffer.mc_addr_high);
++ smu_upper_32_bits(smu_data->smu_buffer.mc_addr));
+ smu7_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SMU_DRAM_ADDR_LO,
+- smu_data->smu_buffer.mc_addr_low);
++ smu_lower_32_bits(smu_data->smu_buffer.mc_addr));
+ }
+ fw_to_load = UCODE_ID_RLC_G_MASK
+ + UCODE_ID_SDMA0_MASK
+@@ -472,8 +472,8 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr)
+ UCODE_ID_MEC_STORAGE, &toc->entry[toc->num_entries++]),
+ "Failed to Get Firmware Entry.", return -EINVAL);
+
+- smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_HI, smu_data->header_buffer.mc_addr_high);
+- smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_LO, smu_data->header_buffer.mc_addr_low);
++ smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_HI, smu_upper_32_bits(smu_data->header_buffer.mc_addr));
++ smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_LO, smu_lower_32_bits(smu_data->header_buffer.mc_addr));
+
+ if (smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_LoadUcodes, fw_to_load))
+ pr_err("Fail to Request SMU Load uCode");
+@@ -587,7 +587,7 @@ int smu7_init(struct pp_hwmgr *hwmgr)
+ struct smu7_smumgr *smu_data;
+ uint8_t *internal_buf;
+ uint64_t mc_addr = 0;
+-
++ int r;
+ /* Allocate memory for backend private data */
+ smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+ smu_data->header_buffer.data_size =
+@@ -595,47 +595,40 @@ int smu7_init(struct pp_hwmgr *hwmgr)
+
+ /* Allocate FW image data structure and header buffer and
+ * send the header buffer address to SMU */
+- smu_allocate_memory(hwmgr->device,
++ r = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ smu_data->header_buffer.data_size,
+- CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
+ PAGE_SIZE,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &smu_data->header_buffer.handle,
+ &mc_addr,
+- &smu_data->header_buffer.kaddr,
+- &smu_data->header_buffer.handle);
++ &smu_data->header_buffer.kaddr);
+
+- smu_data->header = smu_data->header_buffer.kaddr;
+- smu_data->header_buffer.mc_addr_high = smu_upper_32_bits(mc_addr);
+- smu_data->header_buffer.mc_addr_low = smu_lower_32_bits(mc_addr);
++ if (r)
++ return -EINVAL;
+
+- PP_ASSERT_WITH_CODE((NULL != smu_data->header),
+- "Out of memory.",
+- kfree(hwmgr->smu_backend);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)smu_data->header_buffer.handle);
+- return -EINVAL);
++ smu_data->header = smu_data->header_buffer.kaddr;
++ smu_data->header_buffer.mc_addr = mc_addr;
+
+ if (cgs_is_virtualization_enabled(hwmgr->device))
+ return 0;
+
+ smu_data->smu_buffer.data_size = 200*4096;
+- smu_allocate_memory(hwmgr->device,
++ r = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ smu_data->smu_buffer.data_size,
+- CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
+ PAGE_SIZE,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &smu_data->smu_buffer.handle,
+ &mc_addr,
+- &smu_data->smu_buffer.kaddr,
+- &smu_data->smu_buffer.handle);
++ &smu_data->smu_buffer.kaddr);
+
++ if (r) {
++ amdgpu_bo_free_kernel(&smu_data->header_buffer.handle,
++ &smu_data->header_buffer.mc_addr,
++ &smu_data->header_buffer.kaddr);
++ return -EINVAL;
++ }
+ internal_buf = smu_data->smu_buffer.kaddr;
+- smu_data->smu_buffer.mc_addr_high = smu_upper_32_bits(mc_addr);
+- smu_data->smu_buffer.mc_addr_low = smu_lower_32_bits(mc_addr);
+-
+- PP_ASSERT_WITH_CODE((NULL != internal_buf),
+- "Out of memory.",
+- kfree(hwmgr->smu_backend);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)smu_data->smu_buffer.handle);
+- return -EINVAL);
++ smu_data->smu_buffer.mc_addr = mc_addr;
+
+ if (smum_is_hw_avfs_present(hwmgr))
+ smu_data->avfs.avfs_btc_status = AVFS_BTC_BOOT;
+@@ -650,9 +643,14 @@ int smu7_smu_fini(struct pp_hwmgr *hwmgr)
+ {
+ struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+
+- smu_free_memory(hwmgr->device, (void *) smu_data->header_buffer.handle);
++ amdgpu_bo_free_kernel(&smu_data->header_buffer.handle,
++ &smu_data->header_buffer.mc_addr,
++ &smu_data->header_buffer.kaddr);
++
+ if (!cgs_is_virtualization_enabled(hwmgr->device))
+- smu_free_memory(hwmgr->device, (void *) smu_data->smu_buffer.handle);
++ amdgpu_bo_free_kernel(&smu_data->smu_buffer.handle,
++ &smu_data->smu_buffer.mc_addr,
++ &smu_data->smu_buffer.kaddr);
+
+ kfree(hwmgr->smu_backend);
+ hwmgr->smu_backend = NULL;
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h
+index c87263b..64334a8 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h
+@@ -31,10 +31,9 @@
+
+ struct smu7_buffer_entry {
+ uint32_t data_size;
+- uint32_t mc_addr_low;
+- uint32_t mc_addr_high;
++ uint64_t mc_addr;
+ void *kaddr;
+- unsigned long handle;
++ struct amdgpu_bo *handle;
+ };
+
+ struct smu7_avfs {
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c
+index 43b1010..3645127 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c
+@@ -144,57 +144,6 @@ int smum_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
+ hwmgr, msg, parameter);
+ }
+
+-int smu_allocate_memory(void *device, uint32_t size,
+- enum cgs_gpu_mem_type type,
+- uint32_t byte_align, uint64_t *mc_addr,
+- void **kptr, void *handle)
+-{
+- int ret = 0;
+- cgs_handle_t cgs_handle;
+-
+- if (device == NULL || handle == NULL ||
+- mc_addr == NULL || kptr == NULL)
+- return -EINVAL;
+-
+- ret = cgs_alloc_gpu_mem(device, type, size, byte_align,
+- (cgs_handle_t *)handle);
+- if (ret)
+- return -ENOMEM;
+-
+- cgs_handle = *(cgs_handle_t *)handle;
+-
+- ret = cgs_gmap_gpu_mem(device, cgs_handle, mc_addr);
+- if (ret)
+- goto error_gmap;
+-
+- ret = cgs_kmap_gpu_mem(device, cgs_handle, kptr);
+- if (ret)
+- goto error_kmap;
+-
+- return 0;
+-
+-error_kmap:
+- cgs_gunmap_gpu_mem(device, cgs_handle);
+-
+-error_gmap:
+- cgs_free_gpu_mem(device, cgs_handle);
+- return ret;
+-}
+-
+-int smu_free_memory(void *device, void *handle)
+-{
+- cgs_handle_t cgs_handle = (cgs_handle_t)handle;
+-
+- if (device == NULL || handle == NULL)
+- return -EINVAL;
+-
+- cgs_kunmap_gpu_mem(device, cgs_handle);
+- cgs_gunmap_gpu_mem(device, cgs_handle);
+- cgs_free_gpu_mem(device, cgs_handle);
+-
+- return 0;
+-}
+-
+ int smum_init_smc_table(struct pp_hwmgr *hwmgr)
+ {
+ if (NULL != hwmgr->smumgr_funcs->init_smc_table)
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c
+index 68db582..1658e47 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c
+@@ -230,10 +230,10 @@ int vega10_copy_table_from_smc(struct pp_hwmgr *hwmgr,
+ "Invalid SMU Table Length!", return -EINVAL);
+ vega10_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetDriverDramAddrHigh,
+- priv->smu_tables.entry[table_id].table_addr_high);
++ smu_upper_32_bits(priv->smu_tables.entry[table_id].mc_addr));
+ vega10_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetDriverDramAddrLow,
+- priv->smu_tables.entry[table_id].table_addr_low);
++ smu_lower_32_bits(priv->smu_tables.entry[table_id].mc_addr));
+ vega10_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_TransferTableSmu2Dram,
+ priv->smu_tables.entry[table_id].table_id);
+@@ -267,10 +267,10 @@ int vega10_copy_table_to_smc(struct pp_hwmgr *hwmgr,
+
+ vega10_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetDriverDramAddrHigh,
+- priv->smu_tables.entry[table_id].table_addr_high);
++ smu_upper_32_bits(priv->smu_tables.entry[table_id].mc_addr));
+ vega10_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetDriverDramAddrLow,
+- priv->smu_tables.entry[table_id].table_addr_low);
++ smu_lower_32_bits(priv->smu_tables.entry[table_id].mc_addr));
+ vega10_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_TransferTableDram2Smu,
+ priv->smu_tables.entry[table_id].table_id);
+@@ -334,14 +334,13 @@ int vega10_set_tools_address(struct pp_hwmgr *hwmgr)
+ struct vega10_smumgr *priv =
+ (struct vega10_smumgr *)(hwmgr->smu_backend);
+
+- if (priv->smu_tables.entry[TOOLSTABLE].table_addr_high ||
+- priv->smu_tables.entry[TOOLSTABLE].table_addr_low) {
++ if (priv->smu_tables.entry[TOOLSTABLE].mc_addr) {
+ vega10_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetToolsDramAddrHigh,
+- priv->smu_tables.entry[TOOLSTABLE].table_addr_high);
++ smu_upper_32_bits(priv->smu_tables.entry[TOOLSTABLE].mc_addr));
+ vega10_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetToolsDramAddrLow,
+- priv->smu_tables.entry[TOOLSTABLE].table_addr_low);
++ smu_lower_32_bits(priv->smu_tables.entry[TOOLSTABLE].mc_addr));
+ }
+ return 0;
+ }
+@@ -381,7 +380,8 @@ static int vega10_smu_init(struct pp_hwmgr *hwmgr)
+ struct vega10_smumgr *priv;
+ uint64_t mc_addr;
+ void *kaddr = NULL;
+- unsigned long handle, tools_size;
++ unsigned long tools_size;
++ struct amdgpu_bo *handle;
+ int ret;
+ struct cgs_firmware_info info = {0};
+
+@@ -399,147 +399,119 @@ static int vega10_smu_init(struct pp_hwmgr *hwmgr)
+ hwmgr->smu_backend = priv;
+
+ /* allocate space for pptable */
+- smu_allocate_memory(hwmgr->device,
++ ret = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ sizeof(PPTable_t),
+- CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
+ PAGE_SIZE,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &handle,
+ &mc_addr,
+- &kaddr,
+- &handle);
+-
+- PP_ASSERT_WITH_CODE(kaddr,
+- "[vega10_smu_init] Out of memory for pptable.",
+- kfree(hwmgr->smu_backend);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)handle);
+- return -EINVAL);
++ &kaddr);
++
++ if (ret)
++ return -EINVAL;
+
+ priv->smu_tables.entry[PPTABLE].version = 0x01;
+ priv->smu_tables.entry[PPTABLE].size = sizeof(PPTable_t);
+ priv->smu_tables.entry[PPTABLE].table_id = TABLE_PPTABLE;
+- priv->smu_tables.entry[PPTABLE].table_addr_high =
+- smu_upper_32_bits(mc_addr);
+- priv->smu_tables.entry[PPTABLE].table_addr_low =
+- smu_lower_32_bits(mc_addr);
++ priv->smu_tables.entry[PPTABLE].mc_addr = mc_addr;
+ priv->smu_tables.entry[PPTABLE].table = kaddr;
+ priv->smu_tables.entry[PPTABLE].handle = handle;
+
+ /* allocate space for watermarks table */
+- smu_allocate_memory(hwmgr->device,
++ ret = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ sizeof(Watermarks_t),
+- CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
+ PAGE_SIZE,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &handle,
+ &mc_addr,
+- &kaddr,
+- &handle);
+-
+- PP_ASSERT_WITH_CODE(kaddr,
+- "[vega10_smu_init] Out of memory for wmtable.",
+- kfree(hwmgr->smu_backend);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)handle);
+- return -EINVAL);
++ &kaddr);
++
++ if (ret)
++ goto err0;
+
+ priv->smu_tables.entry[WMTABLE].version = 0x01;
+ priv->smu_tables.entry[WMTABLE].size = sizeof(Watermarks_t);
+ priv->smu_tables.entry[WMTABLE].table_id = TABLE_WATERMARKS;
+- priv->smu_tables.entry[WMTABLE].table_addr_high =
+- smu_upper_32_bits(mc_addr);
+- priv->smu_tables.entry[WMTABLE].table_addr_low =
+- smu_lower_32_bits(mc_addr);
++ priv->smu_tables.entry[WMTABLE].mc_addr = mc_addr;
+ priv->smu_tables.entry[WMTABLE].table = kaddr;
+ priv->smu_tables.entry[WMTABLE].handle = handle;
+
+ /* allocate space for AVFS table */
+- smu_allocate_memory(hwmgr->device,
++ ret = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ sizeof(AvfsTable_t),
+- CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
+ PAGE_SIZE,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &handle,
+ &mc_addr,
+- &kaddr,
+- &handle);
+-
+- PP_ASSERT_WITH_CODE(kaddr,
+- "[vega10_smu_init] Out of memory for avfs table.",
+- kfree(hwmgr->smu_backend);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)handle);
+- return -EINVAL);
++ &kaddr);
++
++ if (ret)
++ goto err1;
+
+ priv->smu_tables.entry[AVFSTABLE].version = 0x01;
+ priv->smu_tables.entry[AVFSTABLE].size = sizeof(AvfsTable_t);
+ priv->smu_tables.entry[AVFSTABLE].table_id = TABLE_AVFS;
+- priv->smu_tables.entry[AVFSTABLE].table_addr_high =
+- smu_upper_32_bits(mc_addr);
+- priv->smu_tables.entry[AVFSTABLE].table_addr_low =
+- smu_lower_32_bits(mc_addr);
++ priv->smu_tables.entry[AVFSTABLE].mc_addr = mc_addr;
+ priv->smu_tables.entry[AVFSTABLE].table = kaddr;
+ priv->smu_tables.entry[AVFSTABLE].handle = handle;
+
+ tools_size = 0x19000;
+ if (tools_size) {
+- smu_allocate_memory(hwmgr->device,
++ ret = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ tools_size,
+- CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
+ PAGE_SIZE,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &handle,
+ &mc_addr,
+- &kaddr,
+- &handle);
+-
+- if (kaddr) {
+- priv->smu_tables.entry[TOOLSTABLE].version = 0x01;
+- priv->smu_tables.entry[TOOLSTABLE].size = tools_size;
+- priv->smu_tables.entry[TOOLSTABLE].table_id = TABLE_PMSTATUSLOG;
+- priv->smu_tables.entry[TOOLSTABLE].table_addr_high =
+- smu_upper_32_bits(mc_addr);
+- priv->smu_tables.entry[TOOLSTABLE].table_addr_low =
+- smu_lower_32_bits(mc_addr);
+- priv->smu_tables.entry[TOOLSTABLE].table = kaddr;
+- priv->smu_tables.entry[TOOLSTABLE].handle = handle;
+- }
++ &kaddr);
++ if (ret)
++ goto err2;
++ priv->smu_tables.entry[TOOLSTABLE].version = 0x01;
++ priv->smu_tables.entry[TOOLSTABLE].size = tools_size;
++ priv->smu_tables.entry[TOOLSTABLE].table_id = TABLE_PMSTATUSLOG;
++ priv->smu_tables.entry[TOOLSTABLE].mc_addr = mc_addr;
++ priv->smu_tables.entry[TOOLSTABLE].table = kaddr;
++ priv->smu_tables.entry[TOOLSTABLE].handle = handle;
+ }
+
+ /* allocate space for AVFS Fuse table */
+- smu_allocate_memory(hwmgr->device,
++ ret = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
+ sizeof(AvfsFuseOverride_t),
+- CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
+ PAGE_SIZE,
++ AMDGPU_GEM_DOMAIN_VRAM,
++ &handle,
+ &mc_addr,
+- &kaddr,
+- &handle);
+-
+- PP_ASSERT_WITH_CODE(kaddr,
+- "[vega10_smu_init] Out of memory for avfs fuse table.",
+- kfree(hwmgr->smu_backend);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[AVFSTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[TOOLSTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)handle);
+- return -EINVAL);
++ &kaddr);
++ if (ret)
++ goto err3;
+
+ priv->smu_tables.entry[AVFSFUSETABLE].version = 0x01;
+ priv->smu_tables.entry[AVFSFUSETABLE].size = sizeof(AvfsFuseOverride_t);
+ priv->smu_tables.entry[AVFSFUSETABLE].table_id = TABLE_AVFS_FUSE_OVERRIDE;
+- priv->smu_tables.entry[AVFSFUSETABLE].table_addr_high =
+- smu_upper_32_bits(mc_addr);
+- priv->smu_tables.entry[AVFSFUSETABLE].table_addr_low =
+- smu_lower_32_bits(mc_addr);
++ priv->smu_tables.entry[AVFSFUSETABLE].mc_addr = mc_addr;
+ priv->smu_tables.entry[AVFSFUSETABLE].table = kaddr;
+ priv->smu_tables.entry[AVFSFUSETABLE].handle = handle;
+
+ return 0;
++
++err3:
++ if (priv->smu_tables.entry[TOOLSTABLE].table)
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[TOOLSTABLE].handle,
++ &priv->smu_tables.entry[TOOLSTABLE].mc_addr,
++ &priv->smu_tables.entry[TOOLSTABLE].table);
++err2:
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[AVFSTABLE].handle,
++ &priv->smu_tables.entry[AVFSTABLE].mc_addr,
++ &priv->smu_tables.entry[AVFSTABLE].table);
++err1:
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[WMTABLE].handle,
++ &priv->smu_tables.entry[WMTABLE].mc_addr,
++ &priv->smu_tables.entry[WMTABLE].table);
++err0:
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[PPTABLE].handle,
++ &priv->smu_tables.entry[PPTABLE].mc_addr,
++ &priv->smu_tables.entry[PPTABLE].table);
++ return -EINVAL;
+ }
+
+ static int vega10_smu_fini(struct pp_hwmgr *hwmgr)
+@@ -548,17 +520,22 @@ static int vega10_smu_fini(struct pp_hwmgr *hwmgr)
+ (struct vega10_smumgr *)(hwmgr->smu_backend);
+
+ if (priv) {
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[AVFSTABLE].handle);
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[PPTABLE].handle,
++ &priv->smu_tables.entry[PPTABLE].mc_addr,
++ &priv->smu_tables.entry[PPTABLE].table);
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[WMTABLE].handle,
++ &priv->smu_tables.entry[WMTABLE].mc_addr,
++ &priv->smu_tables.entry[WMTABLE].table);
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[AVFSTABLE].handle,
++ &priv->smu_tables.entry[AVFSTABLE].mc_addr,
++ &priv->smu_tables.entry[AVFSTABLE].table);
+ if (priv->smu_tables.entry[TOOLSTABLE].table)
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[TOOLSTABLE].handle);
+- cgs_free_gpu_mem(hwmgr->device,
+- (cgs_handle_t)priv->smu_tables.entry[AVFSFUSETABLE].handle);
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[TOOLSTABLE].handle,
++ &priv->smu_tables.entry[TOOLSTABLE].mc_addr,
++ &priv->smu_tables.entry[TOOLSTABLE].table);
++ amdgpu_bo_free_kernel(&priv->smu_tables.entry[AVFSFUSETABLE].handle,
++ &priv->smu_tables.entry[AVFSFUSETABLE].mc_addr,
++ &priv->smu_tables.entry[AVFSFUSETABLE].table);
+ kfree(hwmgr->smu_backend);
+ hwmgr->smu_backend = NULL;
+ }
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h
+index 0695455..736f8cf 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h
+@@ -38,10 +38,9 @@ struct smu_table_entry {
+ uint32_t version;
+ uint32_t size;
+ uint32_t table_id;
+- uint32_t table_addr_high;
+- uint32_t table_addr_low;
+- uint8_t *table;
+- unsigned long handle;
++ uint64_t mc_addr;
++ void *table;
++ struct amdgpu_bo *handle;
+ };
+
+ struct smu_table_array {
+--
+2.7.4
+