mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 13:19:56 -04:00
Merge tag 'amd-drm-fixes-6.17-2025-08-07' of https://gitlab.freedesktop.org/agd5f/linux into drm-next
amd-drm-fixes-6.17-2025-08-07: amdgpu: - GC 9.5.0 fixes - SMU fix - DCE 6 DC fixes - mmhub client ID fixes - VRR fix - Backlight fix - UserQ fix - Legacy reset fix - Misc fixes amdkfd: - CRIU fix - Debugfs fix Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://lore.kernel.org/r/20250807132030.1168068-1-alexander.deucher@amd.com
This commit is contained in:
@@ -2570,9 +2570,6 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
|
||||
|
||||
adev->firmware.gpu_info_fw = NULL;
|
||||
|
||||
if (adev->mman.discovery_bin)
|
||||
return 0;
|
||||
|
||||
switch (adev->asic_type) {
|
||||
default:
|
||||
return 0;
|
||||
@@ -2594,6 +2591,8 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
|
||||
chip_name = "arcturus";
|
||||
break;
|
||||
case CHIP_NAVI12:
|
||||
if (adev->mman.discovery_bin)
|
||||
return 0;
|
||||
chip_name = "navi12";
|
||||
break;
|
||||
}
|
||||
@@ -3271,6 +3270,7 @@ static bool amdgpu_device_check_vram_lost(struct amdgpu_device *adev)
|
||||
* always assumed to be lost.
|
||||
*/
|
||||
switch (amdgpu_asic_reset_method(adev)) {
|
||||
case AMD_RESET_METHOD_LEGACY:
|
||||
case AMD_RESET_METHOD_LINK:
|
||||
case AMD_RESET_METHOD_BACO:
|
||||
case AMD_RESET_METHOD_MODE1:
|
||||
|
||||
@@ -276,7 +276,7 @@ static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev,
|
||||
u32 msg;
|
||||
|
||||
if (!amdgpu_sriov_vf(adev)) {
|
||||
/* It can take up to a second for IFWI init to complete on some dGPUs,
|
||||
/* It can take up to two second for IFWI init to complete on some dGPUs,
|
||||
* but generally it should be in the 60-100ms range. Normally this starts
|
||||
* as soon as the device gets power so by the time the OS loads this has long
|
||||
* completed. However, when a card is hotplugged via e.g., USB4, we need to
|
||||
@@ -284,7 +284,7 @@ static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev,
|
||||
* continue.
|
||||
*/
|
||||
|
||||
for (i = 0; i < 1000; i++) {
|
||||
for (i = 0; i < 2000; i++) {
|
||||
msg = RREG32(mmMP0_SMN_C2PMSG_33);
|
||||
if (msg & 0x80000000)
|
||||
break;
|
||||
@@ -2555,40 +2555,11 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_VEGA10:
|
||||
case CHIP_VEGA12:
|
||||
case CHIP_RAVEN:
|
||||
case CHIP_VEGA20:
|
||||
case CHIP_ARCTURUS:
|
||||
case CHIP_ALDEBARAN:
|
||||
/* this is not fatal. We have a fallback below
|
||||
* if the new firmwares are not present. some of
|
||||
* this will be overridden below to keep things
|
||||
* consistent with the current behavior.
|
||||
/* This is not fatal. We only need the discovery
|
||||
* binary for sysfs. We don't need it for a
|
||||
* functional system.
|
||||
*/
|
||||
r = amdgpu_discovery_reg_base_init(adev);
|
||||
if (!r) {
|
||||
amdgpu_discovery_harvest_ip(adev);
|
||||
amdgpu_discovery_get_gfx_info(adev);
|
||||
amdgpu_discovery_get_mall_info(adev);
|
||||
amdgpu_discovery_get_vcn_info(adev);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
r = amdgpu_discovery_reg_base_init(adev);
|
||||
if (r) {
|
||||
drm_err(&adev->ddev, "discovery failed: %d\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
amdgpu_discovery_harvest_ip(adev);
|
||||
amdgpu_discovery_get_gfx_info(adev);
|
||||
amdgpu_discovery_get_mall_info(adev);
|
||||
amdgpu_discovery_get_vcn_info(adev);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_VEGA10:
|
||||
amdgpu_discovery_init(adev);
|
||||
vega10_reg_base_init(adev);
|
||||
adev->sdma.num_instances = 2;
|
||||
adev->gmc.num_umc = 4;
|
||||
@@ -2611,6 +2582,11 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
|
||||
adev->ip_versions[DCI_HWIP][0] = IP_VERSION(12, 0, 0);
|
||||
break;
|
||||
case CHIP_VEGA12:
|
||||
/* This is not fatal. We only need the discovery
|
||||
* binary for sysfs. We don't need it for a
|
||||
* functional system.
|
||||
*/
|
||||
amdgpu_discovery_init(adev);
|
||||
vega10_reg_base_init(adev);
|
||||
adev->sdma.num_instances = 2;
|
||||
adev->gmc.num_umc = 4;
|
||||
@@ -2633,6 +2609,11 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
|
||||
adev->ip_versions[DCI_HWIP][0] = IP_VERSION(12, 0, 1);
|
||||
break;
|
||||
case CHIP_RAVEN:
|
||||
/* This is not fatal. We only need the discovery
|
||||
* binary for sysfs. We don't need it for a
|
||||
* functional system.
|
||||
*/
|
||||
amdgpu_discovery_init(adev);
|
||||
vega10_reg_base_init(adev);
|
||||
adev->sdma.num_instances = 1;
|
||||
adev->vcn.num_vcn_inst = 1;
|
||||
@@ -2674,6 +2655,11 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
|
||||
}
|
||||
break;
|
||||
case CHIP_VEGA20:
|
||||
/* This is not fatal. We only need the discovery
|
||||
* binary for sysfs. We don't need it for a
|
||||
* functional system.
|
||||
*/
|
||||
amdgpu_discovery_init(adev);
|
||||
vega20_reg_base_init(adev);
|
||||
adev->sdma.num_instances = 2;
|
||||
adev->gmc.num_umc = 8;
|
||||
@@ -2697,6 +2683,11 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
|
||||
adev->ip_versions[DCI_HWIP][0] = IP_VERSION(12, 1, 0);
|
||||
break;
|
||||
case CHIP_ARCTURUS:
|
||||
/* This is not fatal. We only need the discovery
|
||||
* binary for sysfs. We don't need it for a
|
||||
* functional system.
|
||||
*/
|
||||
amdgpu_discovery_init(adev);
|
||||
arct_reg_base_init(adev);
|
||||
adev->sdma.num_instances = 8;
|
||||
adev->vcn.num_vcn_inst = 2;
|
||||
@@ -2725,6 +2716,11 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
|
||||
adev->ip_versions[UVD_HWIP][1] = IP_VERSION(2, 5, 0);
|
||||
break;
|
||||
case CHIP_ALDEBARAN:
|
||||
/* This is not fatal. We only need the discovery
|
||||
* binary for sysfs. We don't need it for a
|
||||
* functional system.
|
||||
*/
|
||||
amdgpu_discovery_init(adev);
|
||||
aldebaran_reg_base_init(adev);
|
||||
adev->sdma.num_instances = 5;
|
||||
adev->vcn.num_vcn_inst = 2;
|
||||
@@ -2751,6 +2747,16 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
|
||||
adev->ip_versions[XGMI_HWIP][0] = IP_VERSION(6, 1, 0);
|
||||
break;
|
||||
default:
|
||||
r = amdgpu_discovery_reg_base_init(adev);
|
||||
if (r) {
|
||||
drm_err(&adev->ddev, "discovery failed: %d\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
amdgpu_discovery_harvest_ip(adev);
|
||||
amdgpu_discovery_get_gfx_info(adev);
|
||||
amdgpu_discovery_get_mall_info(adev);
|
||||
amdgpu_discovery_get_vcn_info(adev);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -365,13 +365,6 @@ amdgpu_job_prepare_job(struct drm_sched_job *sched_job,
|
||||
dev_err(ring->adev->dev, "Error getting VM ID (%d)\n", r);
|
||||
goto error;
|
||||
}
|
||||
/*
|
||||
* The VM structure might be released after the VMID is
|
||||
* assigned, we had multiple problems with people trying to use
|
||||
* the VM pointer so better set it to NULL.
|
||||
*/
|
||||
if (!fence)
|
||||
job->vm = NULL;
|
||||
return fence;
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,8 @@ u64 amdgpu_nbio_get_pcie_replay_count(struct amdgpu_device *adev)
|
||||
|
||||
bool amdgpu_nbio_is_replay_cnt_supported(struct amdgpu_device *adev)
|
||||
{
|
||||
if (amdgpu_sriov_vf(adev) || !adev->asic_funcs->get_pcie_replay_count ||
|
||||
if (amdgpu_sriov_vf(adev) || !adev->asic_funcs ||
|
||||
!adev->asic_funcs->get_pcie_replay_count ||
|
||||
(!adev->nbio.funcs || !adev->nbio.funcs->get_pcie_replay_count))
|
||||
return false;
|
||||
|
||||
|
||||
@@ -227,6 +227,7 @@ static int __aqua_vanjaram_get_px_mode_info(struct amdgpu_xcp_mgr *xcp_mgr,
|
||||
uint16_t *nps_modes)
|
||||
{
|
||||
struct amdgpu_device *adev = xcp_mgr->adev;
|
||||
uint32_t gc_ver = amdgpu_ip_version(adev, GC_HWIP, 0);
|
||||
|
||||
if (!num_xcp || !nps_modes || !(xcp_mgr->supp_xcp_modes & BIT(px_mode)))
|
||||
return -EINVAL;
|
||||
@@ -250,12 +251,14 @@ static int __aqua_vanjaram_get_px_mode_info(struct amdgpu_xcp_mgr *xcp_mgr,
|
||||
*num_xcp = 4;
|
||||
*nps_modes = BIT(AMDGPU_NPS1_PARTITION_MODE) |
|
||||
BIT(AMDGPU_NPS4_PARTITION_MODE);
|
||||
if (gc_ver == IP_VERSION(9, 5, 0))
|
||||
*nps_modes |= BIT(AMDGPU_NPS2_PARTITION_MODE);
|
||||
break;
|
||||
case AMDGPU_CPX_PARTITION_MODE:
|
||||
*num_xcp = NUM_XCC(adev->gfx.xcc_mask);
|
||||
*nps_modes = BIT(AMDGPU_NPS1_PARTITION_MODE) |
|
||||
BIT(AMDGPU_NPS4_PARTITION_MODE);
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
if (gc_ver == IP_VERSION(9, 5, 0))
|
||||
*nps_modes |= BIT(AMDGPU_NPS2_PARTITION_MODE);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -36,40 +36,47 @@
|
||||
|
||||
static const char *mmhub_client_ids_v3_0_1[][2] = {
|
||||
[0][0] = "VMC",
|
||||
[1][0] = "ISPXT",
|
||||
[2][0] = "ISPIXT",
|
||||
[4][0] = "DCEDMC",
|
||||
[5][0] = "DCEVGA",
|
||||
[6][0] = "MP0",
|
||||
[7][0] = "MP1",
|
||||
[8][0] = "MPIO",
|
||||
[16][0] = "HDP",
|
||||
[17][0] = "LSDMA",
|
||||
[18][0] = "JPEG",
|
||||
[19][0] = "VCNU0",
|
||||
[21][0] = "VSCH",
|
||||
[22][0] = "VCNU1",
|
||||
[23][0] = "VCN1",
|
||||
[32+20][0] = "VCN0",
|
||||
[2][1] = "DBGUNBIO",
|
||||
[8][0] = "MPM",
|
||||
[12][0] = "ISPTNR",
|
||||
[14][0] = "ISPCRD0",
|
||||
[15][0] = "ISPCRD1",
|
||||
[16][0] = "ISPCRD2",
|
||||
[22][0] = "HDP",
|
||||
[23][0] = "LSDMA",
|
||||
[24][0] = "JPEG",
|
||||
[27][0] = "VSCH",
|
||||
[28][0] = "VCNU",
|
||||
[29][0] = "VCN",
|
||||
[1][1] = "ISPXT",
|
||||
[2][1] = "ISPIXT",
|
||||
[3][1] = "DCEDWB",
|
||||
[4][1] = "DCEDMC",
|
||||
[5][1] = "DCEVGA",
|
||||
[6][1] = "MP0",
|
||||
[7][1] = "MP1",
|
||||
[8][1] = "MPIO",
|
||||
[10][1] = "DBGU0",
|
||||
[11][1] = "DBGU1",
|
||||
[12][1] = "DBGU2",
|
||||
[13][1] = "DBGU3",
|
||||
[14][1] = "XDP",
|
||||
[15][1] = "OSSSYS",
|
||||
[16][1] = "HDP",
|
||||
[17][1] = "LSDMA",
|
||||
[18][1] = "JPEG",
|
||||
[19][1] = "VCNU0",
|
||||
[20][1] = "VCN0",
|
||||
[21][1] = "VSCH",
|
||||
[22][1] = "VCNU1",
|
||||
[23][1] = "VCN1",
|
||||
[8][1] = "MPM",
|
||||
[10][1] = "ISPMWR0",
|
||||
[11][1] = "ISPMWR1",
|
||||
[12][1] = "ISPTNR",
|
||||
[13][1] = "ISPSWR",
|
||||
[14][1] = "ISPCWR0",
|
||||
[15][1] = "ISPCWR1",
|
||||
[16][1] = "ISPCWR2",
|
||||
[17][1] = "ISPCWR3",
|
||||
[18][1] = "XDP",
|
||||
[21][1] = "OSSSYS",
|
||||
[22][1] = "HDP",
|
||||
[23][1] = "LSDMA",
|
||||
[24][1] = "JPEG",
|
||||
[27][1] = "VSCH",
|
||||
[28][1] = "VCNU",
|
||||
[29][1] = "VCN",
|
||||
};
|
||||
|
||||
static uint32_t mmhub_v3_0_1_get_invalidate_req(unsigned int vmid,
|
||||
|
||||
@@ -39,6 +39,64 @@
|
||||
#define regDAGB1_L1TLB_REG_RW_3_3_BASE_IDX 1
|
||||
|
||||
static const char *mmhub_client_ids_v3_3[][2] = {
|
||||
[0][0] = "VMC",
|
||||
[1][0] = "ISPXT",
|
||||
[2][0] = "ISPIXT",
|
||||
[4][0] = "DCEDMC",
|
||||
[6][0] = "MP0",
|
||||
[7][0] = "MP1",
|
||||
[8][0] = "MPM",
|
||||
[9][0] = "ISPPDPRD",
|
||||
[10][0] = "ISPCSTATRD",
|
||||
[11][0] = "ISPBYRPRD",
|
||||
[12][0] = "ISPRGBPRD",
|
||||
[13][0] = "ISPMCFPRD",
|
||||
[14][0] = "ISPMCFPRD1",
|
||||
[15][0] = "ISPYUVPRD",
|
||||
[16][0] = "ISPMCSCRD",
|
||||
[17][0] = "ISPGDCRD",
|
||||
[18][0] = "ISPLMERD",
|
||||
[22][0] = "ISPXT1",
|
||||
[23][0] = "ISPIXT1",
|
||||
[24][0] = "HDP",
|
||||
[25][0] = "LSDMA",
|
||||
[26][0] = "JPEG",
|
||||
[27][0] = "VPE",
|
||||
[28][0] = "VSCH",
|
||||
[29][0] = "VCNU",
|
||||
[30][0] = "VCN",
|
||||
[1][1] = "ISPXT",
|
||||
[2][1] = "ISPIXT",
|
||||
[3][1] = "DCEDWB",
|
||||
[4][1] = "DCEDMC",
|
||||
[5][1] = "ISPCSISWR",
|
||||
[6][1] = "MP0",
|
||||
[7][1] = "MP1",
|
||||
[8][1] = "MPM",
|
||||
[9][1] = "ISPPDPWR",
|
||||
[10][1] = "ISPCSTATWR",
|
||||
[11][1] = "ISPBYRPWR",
|
||||
[12][1] = "ISPRGBPWR",
|
||||
[13][1] = "ISPMCFPWR",
|
||||
[14][1] = "ISPMWR0",
|
||||
[15][1] = "ISPYUVPWR",
|
||||
[16][1] = "ISPMCSCWR",
|
||||
[17][1] = "ISPGDCWR",
|
||||
[18][1] = "ISPLMEWR",
|
||||
[20][1] = "ISPMWR2",
|
||||
[21][1] = "OSSSYS",
|
||||
[22][1] = "ISPXT1",
|
||||
[23][1] = "ISPIXT1",
|
||||
[24][1] = "HDP",
|
||||
[25][1] = "LSDMA",
|
||||
[26][1] = "JPEG",
|
||||
[27][1] = "VPE",
|
||||
[28][1] = "VSCH",
|
||||
[29][1] = "VCNU",
|
||||
[30][1] = "VCN",
|
||||
};
|
||||
|
||||
static const char *mmhub_client_ids_v3_3_1[][2] = {
|
||||
[0][0] = "VMC",
|
||||
[4][0] = "DCEDMC",
|
||||
[6][0] = "MP0",
|
||||
@@ -46,10 +104,29 @@ static const char *mmhub_client_ids_v3_3[][2] = {
|
||||
[8][0] = "MPM",
|
||||
[24][0] = "HDP",
|
||||
[25][0] = "LSDMA",
|
||||
[26][0] = "JPEG",
|
||||
[27][0] = "VPE",
|
||||
[29][0] = "VCNU",
|
||||
[30][0] = "VCN",
|
||||
[26][0] = "JPEG0",
|
||||
[27][0] = "VPE0",
|
||||
[28][0] = "VSCH",
|
||||
[29][0] = "VCNU0",
|
||||
[30][0] = "VCN0",
|
||||
[32+1][0] = "ISPXT",
|
||||
[32+2][0] = "ISPIXT",
|
||||
[32+9][0] = "ISPPDPRD",
|
||||
[32+10][0] = "ISPCSTATRD",
|
||||
[32+11][0] = "ISPBYRPRD",
|
||||
[32+12][0] = "ISPRGBPRD",
|
||||
[32+13][0] = "ISPMCFPRD",
|
||||
[32+14][0] = "ISPMCFPRD1",
|
||||
[32+15][0] = "ISPYUVPRD",
|
||||
[32+16][0] = "ISPMCSCRD",
|
||||
[32+17][0] = "ISPGDCRD",
|
||||
[32+18][0] = "ISPLMERD",
|
||||
[32+22][0] = "ISPXT1",
|
||||
[32+23][0] = "ISPIXT1",
|
||||
[32+26][0] = "JPEG1",
|
||||
[32+27][0] = "VPE1",
|
||||
[32+29][0] = "VCNU1",
|
||||
[32+30][0] = "VCN1",
|
||||
[3][1] = "DCEDWB",
|
||||
[4][1] = "DCEDMC",
|
||||
[6][1] = "MP0",
|
||||
@@ -58,10 +135,32 @@ static const char *mmhub_client_ids_v3_3[][2] = {
|
||||
[21][1] = "OSSSYS",
|
||||
[24][1] = "HDP",
|
||||
[25][1] = "LSDMA",
|
||||
[26][1] = "JPEG",
|
||||
[27][1] = "VPE",
|
||||
[29][1] = "VCNU",
|
||||
[30][1] = "VCN",
|
||||
[26][1] = "JPEG0",
|
||||
[27][1] = "VPE0",
|
||||
[28][1] = "VSCH",
|
||||
[29][1] = "VCNU0",
|
||||
[30][1] = "VCN0",
|
||||
[32+1][1] = "ISPXT",
|
||||
[32+2][1] = "ISPIXT",
|
||||
[32+5][1] = "ISPCSISWR",
|
||||
[32+9][1] = "ISPPDPWR",
|
||||
[32+10][1] = "ISPCSTATWR",
|
||||
[32+11][1] = "ISPBYRPWR",
|
||||
[32+12][1] = "ISPRGBPWR",
|
||||
[32+13][1] = "ISPMCFPWR",
|
||||
[32+14][1] = "ISPMWR0",
|
||||
[32+15][1] = "ISPYUVPWR",
|
||||
[32+16][1] = "ISPMCSCWR",
|
||||
[32+17][1] = "ISPGDCWR",
|
||||
[32+18][1] = "ISPLMEWR",
|
||||
[32+19][1] = "ISPMWR1",
|
||||
[32+20][1] = "ISPMWR2",
|
||||
[32+22][1] = "ISPXT1",
|
||||
[32+23][1] = "ISPIXT1",
|
||||
[32+26][1] = "JPEG1",
|
||||
[32+27][1] = "VPE1",
|
||||
[32+29][1] = "VCNU1",
|
||||
[32+30][1] = "VCN1",
|
||||
};
|
||||
|
||||
static uint32_t mmhub_v3_3_get_invalidate_req(unsigned int vmid,
|
||||
@@ -102,12 +201,16 @@ mmhub_v3_3_print_l2_protection_fault_status(struct amdgpu_device *adev,
|
||||
|
||||
switch (amdgpu_ip_version(adev, MMHUB_HWIP, 0)) {
|
||||
case IP_VERSION(3, 3, 0):
|
||||
case IP_VERSION(3, 3, 1):
|
||||
case IP_VERSION(3, 3, 2):
|
||||
mmhub_cid = cid < ARRAY_SIZE(mmhub_client_ids_v3_3) ?
|
||||
mmhub_client_ids_v3_3[cid][rw] :
|
||||
cid == 0x140 ? "UMSCH" : NULL;
|
||||
break;
|
||||
case IP_VERSION(3, 3, 1):
|
||||
mmhub_cid = cid < ARRAY_SIZE(mmhub_client_ids_v3_3_1) ?
|
||||
mmhub_client_ids_v3_3_1[cid][rw] :
|
||||
cid == 0x140 ? "UMSCH" : NULL;
|
||||
break;
|
||||
default:
|
||||
mmhub_cid = NULL;
|
||||
break;
|
||||
|
||||
@@ -1353,7 +1353,7 @@ static int sdma_v7_0_sw_init(struct amdgpu_ip_block *ip_block)
|
||||
switch (amdgpu_ip_version(adev, SDMA0_HWIP, 0)) {
|
||||
case IP_VERSION(7, 0, 0):
|
||||
case IP_VERSION(7, 0, 1):
|
||||
if ((adev->sdma.instance[0].fw_version >= 7836028) && !adev->sdma.disable_uq)
|
||||
if ((adev->sdma.instance[0].fw_version >= 7966358) && !adev->sdma.disable_uq)
|
||||
adev->userq_funcs[AMDGPU_HW_IP_DMA] = &userq_mes_funcs;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1218,6 +1218,8 @@ static int soc15_common_early_init(struct amdgpu_ip_block *ip_block)
|
||||
AMD_PG_SUPPORT_JPEG;
|
||||
/*TODO: need a new external_rev_id for GC 9.4.4? */
|
||||
adev->external_rev_id = adev->rev_id + 0x46;
|
||||
if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 5, 0))
|
||||
adev->external_rev_id = adev->rev_id + 0x50;
|
||||
break;
|
||||
default:
|
||||
/* FIXME: not supported yet */
|
||||
|
||||
@@ -2725,7 +2725,7 @@ static void get_queue_checkpoint_info(struct device_queue_manager *dqm,
|
||||
|
||||
dqm_lock(dqm);
|
||||
mqd_mgr = dqm->mqd_mgrs[mqd_type];
|
||||
*mqd_size = mqd_mgr->mqd_size;
|
||||
*mqd_size = mqd_mgr->mqd_size * NUM_XCC(mqd_mgr->dev->xcc_mask);
|
||||
*ctl_stack_size = 0;
|
||||
|
||||
if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE && mqd_mgr->get_checkpoint_info)
|
||||
|
||||
@@ -78,8 +78,8 @@ static int kfd_init(void)
|
||||
static void kfd_exit(void)
|
||||
{
|
||||
kfd_cleanup_processes();
|
||||
kfd_debugfs_fini();
|
||||
kfd_process_destroy_wq();
|
||||
kfd_debugfs_fini();
|
||||
kfd_procfs_shutdown();
|
||||
kfd_topology_shutdown();
|
||||
kfd_chardev_exit();
|
||||
|
||||
@@ -373,7 +373,7 @@ static void get_checkpoint_info(struct mqd_manager *mm, void *mqd, u32 *ctl_stac
|
||||
{
|
||||
struct v9_mqd *m = get_mqd(mqd);
|
||||
|
||||
*ctl_stack_size = m->cp_hqd_cntl_stack_size;
|
||||
*ctl_stack_size = m->cp_hqd_cntl_stack_size * NUM_XCC(mm->dev->xcc_mask);
|
||||
}
|
||||
|
||||
static void checkpoint_mqd(struct mqd_manager *mm, void *mqd, void *mqd_dst, void *ctl_stack_dst)
|
||||
@@ -388,6 +388,24 @@ static void checkpoint_mqd(struct mqd_manager *mm, void *mqd, void *mqd_dst, voi
|
||||
memcpy(ctl_stack_dst, ctl_stack, m->cp_hqd_cntl_stack_size);
|
||||
}
|
||||
|
||||
static void checkpoint_mqd_v9_4_3(struct mqd_manager *mm,
|
||||
void *mqd,
|
||||
void *mqd_dst,
|
||||
void *ctl_stack_dst)
|
||||
{
|
||||
struct v9_mqd *m;
|
||||
int xcc;
|
||||
uint64_t size = get_mqd(mqd)->cp_mqd_stride_size;
|
||||
|
||||
for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) {
|
||||
m = get_mqd(mqd + size * xcc);
|
||||
|
||||
checkpoint_mqd(mm, m,
|
||||
(uint8_t *)mqd_dst + sizeof(*m) * xcc,
|
||||
(uint8_t *)ctl_stack_dst + m->cp_hqd_cntl_stack_size * xcc);
|
||||
}
|
||||
}
|
||||
|
||||
static void restore_mqd(struct mqd_manager *mm, void **mqd,
|
||||
struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
|
||||
struct queue_properties *qp,
|
||||
@@ -764,13 +782,35 @@ static void restore_mqd_v9_4_3(struct mqd_manager *mm, void **mqd,
|
||||
const void *mqd_src,
|
||||
const void *ctl_stack_src, u32 ctl_stack_size)
|
||||
{
|
||||
restore_mqd(mm, mqd, mqd_mem_obj, gart_addr, qp, mqd_src, ctl_stack_src, ctl_stack_size);
|
||||
if (amdgpu_sriov_multi_vf_mode(mm->dev->adev)) {
|
||||
struct v9_mqd *m;
|
||||
struct kfd_mem_obj xcc_mqd_mem_obj;
|
||||
u32 mqd_ctl_stack_size;
|
||||
struct v9_mqd *m;
|
||||
u32 num_xcc;
|
||||
int xcc;
|
||||
|
||||
m = (struct v9_mqd *) mqd_mem_obj->cpu_ptr;
|
||||
m->cp_hqd_pq_doorbell_control |= 1 <<
|
||||
CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT;
|
||||
uint64_t offset = mm->mqd_stride(mm, qp);
|
||||
|
||||
mm->dev->dqm->current_logical_xcc_start++;
|
||||
|
||||
num_xcc = NUM_XCC(mm->dev->xcc_mask);
|
||||
mqd_ctl_stack_size = ctl_stack_size / num_xcc;
|
||||
|
||||
memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj));
|
||||
|
||||
/* Set the MQD pointer and gart address to XCC0 MQD */
|
||||
*mqd = mqd_mem_obj->cpu_ptr;
|
||||
if (gart_addr)
|
||||
*gart_addr = mqd_mem_obj->gpu_addr;
|
||||
|
||||
for (xcc = 0; xcc < num_xcc; xcc++) {
|
||||
get_xcc_mqd(mqd_mem_obj, &xcc_mqd_mem_obj, offset * xcc);
|
||||
restore_mqd(mm, (void **)&m,
|
||||
&xcc_mqd_mem_obj,
|
||||
NULL,
|
||||
qp,
|
||||
(uint8_t *)mqd_src + xcc * sizeof(*m),
|
||||
(uint8_t *)ctl_stack_src + xcc * mqd_ctl_stack_size,
|
||||
mqd_ctl_stack_size);
|
||||
}
|
||||
}
|
||||
static int destroy_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
|
||||
@@ -906,7 +946,6 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
|
||||
mqd->free_mqd = kfd_free_mqd_cp;
|
||||
mqd->is_occupied = kfd_is_occupied_cp;
|
||||
mqd->get_checkpoint_info = get_checkpoint_info;
|
||||
mqd->checkpoint_mqd = checkpoint_mqd;
|
||||
mqd->mqd_size = sizeof(struct v9_mqd);
|
||||
mqd->mqd_stride = mqd_stride_v9;
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
@@ -918,16 +957,18 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
|
||||
mqd->init_mqd = init_mqd_v9_4_3;
|
||||
mqd->load_mqd = load_mqd_v9_4_3;
|
||||
mqd->update_mqd = update_mqd_v9_4_3;
|
||||
mqd->restore_mqd = restore_mqd_v9_4_3;
|
||||
mqd->destroy_mqd = destroy_mqd_v9_4_3;
|
||||
mqd->get_wave_state = get_wave_state_v9_4_3;
|
||||
mqd->checkpoint_mqd = checkpoint_mqd_v9_4_3;
|
||||
mqd->restore_mqd = restore_mqd_v9_4_3;
|
||||
} else {
|
||||
mqd->init_mqd = init_mqd;
|
||||
mqd->load_mqd = load_mqd;
|
||||
mqd->update_mqd = update_mqd;
|
||||
mqd->restore_mqd = restore_mqd;
|
||||
mqd->destroy_mqd = kfd_destroy_mqd_cp;
|
||||
mqd->get_wave_state = get_wave_state;
|
||||
mqd->checkpoint_mqd = checkpoint_mqd;
|
||||
mqd->restore_mqd = restore_mqd;
|
||||
}
|
||||
break;
|
||||
case KFD_MQD_TYPE_HIQ:
|
||||
|
||||
@@ -914,7 +914,10 @@ static int criu_checkpoint_queues_device(struct kfd_process_device *pdd,
|
||||
|
||||
q_data = (struct kfd_criu_queue_priv_data *)q_private_data;
|
||||
|
||||
/* data stored in this order: priv_data, mqd, ctl_stack */
|
||||
/*
|
||||
* data stored in this order:
|
||||
* priv_data, mqd[xcc0], mqd[xcc1],..., ctl_stack[xcc0], ctl_stack[xcc1]...
|
||||
*/
|
||||
q_data->mqd_size = mqd_size;
|
||||
q_data->ctl_stack_size = ctl_stack_size;
|
||||
|
||||
@@ -963,7 +966,7 @@ int kfd_criu_checkpoint_queues(struct kfd_process *p,
|
||||
}
|
||||
|
||||
static void set_queue_properties_from_criu(struct queue_properties *qp,
|
||||
struct kfd_criu_queue_priv_data *q_data)
|
||||
struct kfd_criu_queue_priv_data *q_data, uint32_t num_xcc)
|
||||
{
|
||||
qp->is_interop = false;
|
||||
qp->queue_percent = q_data->q_percent;
|
||||
@@ -976,7 +979,11 @@ static void set_queue_properties_from_criu(struct queue_properties *qp,
|
||||
qp->eop_ring_buffer_size = q_data->eop_ring_buffer_size;
|
||||
qp->ctx_save_restore_area_address = q_data->ctx_save_restore_area_address;
|
||||
qp->ctx_save_restore_area_size = q_data->ctx_save_restore_area_size;
|
||||
qp->ctl_stack_size = q_data->ctl_stack_size;
|
||||
if (q_data->type == KFD_QUEUE_TYPE_COMPUTE)
|
||||
qp->ctl_stack_size = q_data->ctl_stack_size / num_xcc;
|
||||
else
|
||||
qp->ctl_stack_size = q_data->ctl_stack_size;
|
||||
|
||||
qp->type = q_data->type;
|
||||
qp->format = q_data->format;
|
||||
}
|
||||
@@ -1036,12 +1043,15 @@ int kfd_criu_restore_queue(struct kfd_process *p,
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* data stored in this order: mqd, ctl_stack */
|
||||
/*
|
||||
* data stored in this order:
|
||||
* mqd[xcc0], mqd[xcc1],..., ctl_stack[xcc0], ctl_stack[xcc1]...
|
||||
*/
|
||||
mqd = q_extra_data;
|
||||
ctl_stack = mqd + q_data->mqd_size;
|
||||
|
||||
memset(&qp, 0, sizeof(qp));
|
||||
set_queue_properties_from_criu(&qp, q_data);
|
||||
set_queue_properties_from_criu(&qp, q_data, NUM_XCC(pdd->dev->adev->gfx.xcc_mask));
|
||||
|
||||
print_queue_properties(&qp);
|
||||
|
||||
|
||||
@@ -4756,16 +4756,16 @@ static int get_brightness_range(const struct amdgpu_dm_backlight_caps *caps,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Rescale from [min..max] to [0..MAX_BACKLIGHT_LEVEL] */
|
||||
/* Rescale from [min..max] to [0..AMDGPU_MAX_BL_LEVEL] */
|
||||
static inline u32 scale_input_to_fw(int min, int max, u64 input)
|
||||
{
|
||||
return DIV_ROUND_CLOSEST_ULL(input * MAX_BACKLIGHT_LEVEL, max - min);
|
||||
return DIV_ROUND_CLOSEST_ULL(input * AMDGPU_MAX_BL_LEVEL, max - min);
|
||||
}
|
||||
|
||||
/* Rescale from [0..MAX_BACKLIGHT_LEVEL] to [min..max] */
|
||||
/* Rescale from [0..AMDGPU_MAX_BL_LEVEL] to [min..max] */
|
||||
static inline u32 scale_fw_to_input(int min, int max, u64 input)
|
||||
{
|
||||
return min + DIV_ROUND_CLOSEST_ULL(input * (max - min), MAX_BACKLIGHT_LEVEL);
|
||||
return min + DIV_ROUND_CLOSEST_ULL(input * (max - min), AMDGPU_MAX_BL_LEVEL);
|
||||
}
|
||||
|
||||
static void convert_custom_brightness(const struct amdgpu_dm_backlight_caps *caps,
|
||||
|
||||
@@ -661,6 +661,15 @@ static int amdgpu_dm_crtc_helper_atomic_check(struct drm_crtc *crtc,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!state->legacy_cursor_update && amdgpu_dm_crtc_vrr_active(dm_crtc_state)) {
|
||||
struct drm_plane_state *primary_state;
|
||||
|
||||
/* Pull in primary plane for correct VRR handling */
|
||||
primary_state = drm_atomic_get_plane_state(state, crtc->primary);
|
||||
if (IS_ERR(primary_state))
|
||||
return PTR_ERR(primary_state);
|
||||
}
|
||||
|
||||
/* In some use cases, like reset, no stream is attached */
|
||||
if (!dm_crtc_state->stream)
|
||||
return 0;
|
||||
|
||||
@@ -158,7 +158,6 @@ struct clk_mgr *dc_clk_mgr_create(struct dc_context *ctx, struct pp_smu_funcs *p
|
||||
return NULL;
|
||||
}
|
||||
dce60_clk_mgr_construct(ctx, clk_mgr);
|
||||
dce_clk_mgr_construct(ctx, clk_mgr);
|
||||
return &clk_mgr->base;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -245,6 +245,11 @@ int dce_set_clock(
|
||||
pxl_clk_params.target_pixel_clock_100hz = requested_clk_khz * 10;
|
||||
pxl_clk_params.pll_id = CLOCK_SOURCE_ID_DFS;
|
||||
|
||||
/* DCE 6.0, DCE 6.4: engine clock is the same as PLL0 */
|
||||
if (clk_mgr_base->ctx->dce_version == DCE_VERSION_6_0 ||
|
||||
clk_mgr_base->ctx->dce_version == DCE_VERSION_6_4)
|
||||
pxl_clk_params.pll_id = CLOCK_SOURCE_ID_PLL0;
|
||||
|
||||
if (clk_mgr_dce->dfs_bypass_active)
|
||||
pxl_clk_params.flags.SET_DISPCLK_DFS_BYPASS = true;
|
||||
|
||||
|
||||
@@ -938,17 +938,18 @@ static void dc_destruct(struct dc *dc)
|
||||
if (dc->link_srv)
|
||||
link_destroy_link_service(&dc->link_srv);
|
||||
|
||||
if (dc->ctx->gpio_service)
|
||||
dal_gpio_service_destroy(&dc->ctx->gpio_service);
|
||||
if (dc->ctx) {
|
||||
if (dc->ctx->gpio_service)
|
||||
dal_gpio_service_destroy(&dc->ctx->gpio_service);
|
||||
|
||||
if (dc->ctx->created_bios)
|
||||
dal_bios_parser_destroy(&dc->ctx->dc_bios);
|
||||
if (dc->ctx->created_bios)
|
||||
dal_bios_parser_destroy(&dc->ctx->dc_bios);
|
||||
kfree(dc->ctx->logger);
|
||||
dc_perf_trace_destroy(&dc->ctx->perf_trace);
|
||||
|
||||
kfree(dc->ctx->logger);
|
||||
dc_perf_trace_destroy(&dc->ctx->perf_trace);
|
||||
|
||||
kfree(dc->ctx);
|
||||
dc->ctx = NULL;
|
||||
kfree(dc->ctx);
|
||||
dc->ctx = NULL;
|
||||
}
|
||||
|
||||
kfree(dc->bw_vbios);
|
||||
dc->bw_vbios = NULL;
|
||||
|
||||
@@ -373,7 +373,7 @@ static const struct resource_caps res_cap = {
|
||||
.num_timing_generator = 6,
|
||||
.num_audio = 6,
|
||||
.num_stream_encoder = 6,
|
||||
.num_pll = 2,
|
||||
.num_pll = 3,
|
||||
.num_ddc = 6,
|
||||
};
|
||||
|
||||
@@ -389,7 +389,7 @@ static const struct resource_caps res_cap_64 = {
|
||||
.num_timing_generator = 2,
|
||||
.num_audio = 2,
|
||||
.num_stream_encoder = 2,
|
||||
.num_pll = 2,
|
||||
.num_pll = 3,
|
||||
.num_ddc = 2,
|
||||
};
|
||||
|
||||
@@ -973,21 +973,24 @@ static bool dce60_construct(
|
||||
|
||||
if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
|
||||
pool->base.dp_clock_source =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
|
||||
|
||||
/* DCE 6.0 and 6.4: PLL0 can only be used with DP. Don't initialize it here. */
|
||||
pool->base.clock_sources[0] =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
|
||||
pool->base.clock_sources[1] =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
|
||||
pool->base.clk_src_count = 2;
|
||||
|
||||
} else {
|
||||
pool->base.dp_clock_source =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
|
||||
|
||||
pool->base.clock_sources[0] =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
|
||||
pool->base.clk_src_count = 1;
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
|
||||
pool->base.clock_sources[1] =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
|
||||
pool->base.clk_src_count = 2;
|
||||
}
|
||||
|
||||
if (pool->base.dp_clock_source == NULL) {
|
||||
@@ -1365,21 +1368,24 @@ static bool dce64_construct(
|
||||
|
||||
if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
|
||||
pool->base.dp_clock_source =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
|
||||
|
||||
/* DCE 6.0 and 6.4: PLL0 can only be used with DP. Don't initialize it here. */
|
||||
pool->base.clock_sources[0] =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], false);
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
|
||||
pool->base.clock_sources[1] =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
|
||||
pool->base.clk_src_count = 2;
|
||||
|
||||
} else {
|
||||
pool->base.dp_clock_source =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], true);
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
|
||||
|
||||
pool->base.clock_sources[0] =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
|
||||
pool->base.clk_src_count = 1;
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
|
||||
pool->base.clock_sources[1] =
|
||||
dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
|
||||
pool->base.clk_src_count = 2;
|
||||
}
|
||||
|
||||
if (pool->base.dp_clock_source == NULL) {
|
||||
|
||||
@@ -77,6 +77,9 @@ static void smu_power_profile_mode_get(struct smu_context *smu,
|
||||
static void smu_power_profile_mode_put(struct smu_context *smu,
|
||||
enum PP_SMC_POWER_PROFILE profile_mode);
|
||||
static enum smu_clk_type smu_convert_to_smuclk(enum pp_clock_type type);
|
||||
static int smu_od_edit_dpm_table(void *handle,
|
||||
enum PP_OD_DPM_TABLE_COMMAND type,
|
||||
long *input, uint32_t size);
|
||||
|
||||
static int smu_sys_get_pp_feature_mask(void *handle,
|
||||
char *buf)
|
||||
@@ -2195,6 +2198,7 @@ static int smu_resume(struct amdgpu_ip_block *ip_block)
|
||||
int ret;
|
||||
struct amdgpu_device *adev = ip_block->adev;
|
||||
struct smu_context *smu = adev->powerplay.pp_handle;
|
||||
struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
|
||||
|
||||
if (amdgpu_sriov_multi_vf_mode(adev))
|
||||
return 0;
|
||||
@@ -2226,6 +2230,18 @@ static int smu_resume(struct amdgpu_ip_block *ip_block)
|
||||
|
||||
adev->pm.dpm_enabled = true;
|
||||
|
||||
if (smu->current_power_limit) {
|
||||
ret = smu_set_power_limit(smu, smu->current_power_limit);
|
||||
if (ret && ret != -EOPNOTSUPP)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (smu_dpm_ctx->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL) {
|
||||
ret = smu_od_edit_dpm_table(smu, PP_OD_COMMIT_DPM_TABLE, NULL, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_info(adev->dev, "SMU is resumed successfully!\n");
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user