amd-drm-fixes-6.7-2023-12-06:
amdgpu: - Disable MCBP on gfx9 - DC vbios fix - eDP fix - dml2 UBSAN fix - SMU 14 fix - RAS fixes - dml KASAN/KCSAN fix - PSP 13 fix - Clockgating fixes - Suspend fix -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQQgO5Idg2tXNTSZAr293/aFa7yZ2AUCZXDwjQAKCRC93/aFa7yZ 2KweAPoCF41L1O8ypNmop5LIkmen9lAwpJLpc2N0c2iZD/iMwgEA2F87hiz8juW5 +UTpM9XxlrjJ3QOz5PHAIGXGkNcnPQE= =mDjj -----END PGP SIGNATURE----- Merge tag 'amd-drm-fixes-6.7-2023-12-06' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes amd-drm-fixes-6.7-2023-12-06: amdgpu: - Disable MCBP on gfx9 - DC vbios fix - eDP fix - dml2 UBSAN fix - SMU 14 fix - RAS fixes - dml KASAN/KCSAN fix - PSP 13 fix - Clockgating fixes - Suspend fix Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20231206221102.4995-1-alexander.deucher@amd.com
This commit is contained in:
commit
9f3e1c5919
@ -3791,10 +3791,6 @@ static void amdgpu_device_set_mcbp(struct amdgpu_device *adev)
|
||||
adev->gfx.mcbp = true;
|
||||
else if (amdgpu_mcbp == 0)
|
||||
adev->gfx.mcbp = false;
|
||||
else if ((amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(9, 0, 0)) &&
|
||||
(amdgpu_ip_version(adev, GC_HWIP, 0) < IP_VERSION(10, 0, 0)) &&
|
||||
adev->gfx.num_gfx_rings)
|
||||
adev->gfx.mcbp = true;
|
||||
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
adev->gfx.mcbp = true;
|
||||
@ -4531,6 +4527,8 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
amdgpu_ttm_set_buffer_funcs_status(adev, false);
|
||||
|
||||
amdgpu_fence_driver_hw_fini(adev);
|
||||
|
||||
amdgpu_device_ip_suspend_phase2(adev);
|
||||
|
@ -46,6 +46,8 @@
|
||||
#define MCA_REG__STATUS__ERRORCODEEXT(x) MCA_REG_FIELD(x, 21, 16)
|
||||
#define MCA_REG__STATUS__ERRORCODE(x) MCA_REG_FIELD(x, 15, 0)
|
||||
|
||||
#define MCA_REG__SYND__ERRORINFORMATION(x) MCA_REG_FIELD(x, 17, 0)
|
||||
|
||||
enum amdgpu_mca_ip {
|
||||
AMDGPU_MCA_IP_UNKNOW = -1,
|
||||
AMDGPU_MCA_IP_PSP = 0,
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/list_sort.h>
|
||||
|
||||
#include "amdgpu.h"
|
||||
#include "amdgpu_ras.h"
|
||||
@ -3665,6 +3666,21 @@ static struct ras_err_node *amdgpu_ras_error_node_new(void)
|
||||
return err_node;
|
||||
}
|
||||
|
||||
static int ras_err_info_cmp(void *priv, const struct list_head *a, const struct list_head *b)
|
||||
{
|
||||
struct ras_err_node *nodea = container_of(a, struct ras_err_node, node);
|
||||
struct ras_err_node *nodeb = container_of(b, struct ras_err_node, node);
|
||||
struct amdgpu_smuio_mcm_config_info *infoa = &nodea->err_info.mcm_info;
|
||||
struct amdgpu_smuio_mcm_config_info *infob = &nodeb->err_info.mcm_info;
|
||||
|
||||
if (unlikely(infoa->socket_id != infob->socket_id))
|
||||
return infoa->socket_id - infob->socket_id;
|
||||
else
|
||||
return infoa->die_id - infob->die_id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ras_err_info *amdgpu_ras_error_get_info(struct ras_err_data *err_data,
|
||||
struct amdgpu_smuio_mcm_config_info *mcm_info)
|
||||
{
|
||||
@ -3682,6 +3698,7 @@ static struct ras_err_info *amdgpu_ras_error_get_info(struct ras_err_data *err_d
|
||||
|
||||
err_data->err_list_count++;
|
||||
list_add_tail(&err_node->node, &err_data->err_node_list);
|
||||
list_sort(NULL, &err_data->err_node_list, ras_err_info_cmp);
|
||||
|
||||
return &err_node->err_info;
|
||||
}
|
||||
|
@ -129,6 +129,11 @@ static void hdp_v4_0_get_clockgating_state(struct amdgpu_device *adev,
|
||||
{
|
||||
int data;
|
||||
|
||||
if (amdgpu_ip_version(adev, HDP_HWIP, 0) == IP_VERSION(4, 4, 2)) {
|
||||
/* Default enabled */
|
||||
*flags |= AMD_CG_SUPPORT_HDP_MGCG;
|
||||
return;
|
||||
}
|
||||
/* AMD_CG_SUPPORT_HDP_LS */
|
||||
data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS));
|
||||
if (data & HDP_MEM_POWER_LS__LS_ENABLE_MASK)
|
||||
|
@ -60,7 +60,7 @@ MODULE_FIRMWARE("amdgpu/psp_14_0_0_ta.bin");
|
||||
#define GFX_CMD_USB_PD_USE_LFB 0x480
|
||||
|
||||
/* Retry times for vmbx ready wait */
|
||||
#define PSP_VMBX_POLLING_LIMIT 20000
|
||||
#define PSP_VMBX_POLLING_LIMIT 3000
|
||||
|
||||
/* VBIOS gfl defines */
|
||||
#define MBOX_READY_MASK 0x80000000
|
||||
@ -161,14 +161,18 @@ static int psp_v13_0_wait_for_vmbx_ready(struct psp_context *psp)
|
||||
static int psp_v13_0_wait_for_bootloader(struct psp_context *psp)
|
||||
{
|
||||
struct amdgpu_device *adev = psp->adev;
|
||||
int retry_loop, ret;
|
||||
int retry_loop, retry_cnt, ret;
|
||||
|
||||
retry_cnt =
|
||||
(amdgpu_ip_version(adev, MP0_HWIP, 0) == IP_VERSION(13, 0, 6)) ?
|
||||
PSP_VMBX_POLLING_LIMIT :
|
||||
10;
|
||||
/* Wait for bootloader to signify that it is ready having bit 31 of
|
||||
* C2PMSG_35 set to 1. All other bits are expected to be cleared.
|
||||
* If there is an error in processing command, bits[7:0] will be set.
|
||||
* This is applicable for PSP v13.0.6 and newer.
|
||||
*/
|
||||
for (retry_loop = 0; retry_loop < PSP_VMBX_POLLING_LIMIT; retry_loop++) {
|
||||
for (retry_loop = 0; retry_loop < retry_cnt; retry_loop++) {
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0xffffffff, false);
|
||||
@ -821,7 +825,7 @@ static int psp_v13_0_query_boot_status(struct psp_context *psp)
|
||||
if (amdgpu_ip_version(adev, MP0_HWIP, 0) != IP_VERSION(13, 0, 6))
|
||||
return 0;
|
||||
|
||||
if (RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_59) < 0x00a10007)
|
||||
if (RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_59) < 0x00a10109)
|
||||
return 0;
|
||||
|
||||
for_each_inst(i, inst_mask) {
|
||||
|
@ -1423,11 +1423,14 @@ static void soc15_common_get_clockgating_state(void *handle, u64 *flags)
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
*flags = 0;
|
||||
|
||||
adev->nbio.funcs->get_clockgating_state(adev, flags);
|
||||
if (adev->nbio.funcs && adev->nbio.funcs->get_clockgating_state)
|
||||
adev->nbio.funcs->get_clockgating_state(adev, flags);
|
||||
|
||||
adev->hdp.funcs->get_clock_gating_state(adev, flags);
|
||||
if (adev->hdp.funcs && adev->hdp.funcs->get_clock_gating_state)
|
||||
adev->hdp.funcs->get_clock_gating_state(adev, flags);
|
||||
|
||||
if (amdgpu_ip_version(adev, MP0_HWIP, 0) != IP_VERSION(13, 0, 2)) {
|
||||
if ((amdgpu_ip_version(adev, MP0_HWIP, 0) != IP_VERSION(13, 0, 2)) &&
|
||||
(amdgpu_ip_version(adev, MP0_HWIP, 0) != IP_VERSION(13, 0, 6))) {
|
||||
/* AMD_CG_SUPPORT_DRM_MGCG */
|
||||
data = RREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_MISC_CGTT_CTRL0));
|
||||
if (!(data & 0x01000000))
|
||||
@ -1440,9 +1443,11 @@ static void soc15_common_get_clockgating_state(void *handle, u64 *flags)
|
||||
}
|
||||
|
||||
/* AMD_CG_SUPPORT_ROM_MGCG */
|
||||
adev->smuio.funcs->get_clock_gating_state(adev, flags);
|
||||
if (adev->smuio.funcs && adev->smuio.funcs->get_clock_gating_state)
|
||||
adev->smuio.funcs->get_clock_gating_state(adev, flags);
|
||||
|
||||
adev->df.funcs->get_clockgating_state(adev, flags);
|
||||
if (adev->df.funcs && adev->df.funcs->get_clockgating_state)
|
||||
adev->df.funcs->get_clockgating_state(adev, flags);
|
||||
}
|
||||
|
||||
static int soc15_common_set_powergating_state(void *handle,
|
||||
|
@ -63,6 +63,12 @@ static void apply_edid_quirks(struct edid *edid, struct dc_edid_caps *edid_caps)
|
||||
DRM_DEBUG_DRIVER("Disabling FAMS on monitor with panel id %X\n", panel_id);
|
||||
edid_caps->panel_patch.disable_fams = true;
|
||||
break;
|
||||
/* Workaround for some monitors that do not clear DPCD 0x317 if FreeSync is unsupported */
|
||||
case drm_edid_encode_panel_id('A', 'U', 'O', 0xA7AB):
|
||||
case drm_edid_encode_panel_id('A', 'U', 'O', 0xE69B):
|
||||
DRM_DEBUG_DRIVER("Clearing DPCD 0x317 on monitor with panel id %X\n", panel_id);
|
||||
edid_caps->panel_patch.remove_sink_ext_caps = true;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
@ -2386,7 +2386,13 @@ static enum bp_result get_vram_info_v30(
|
||||
return BP_RESULT_BADBIOSTABLE;
|
||||
|
||||
info->num_chans = info_v30->channel_num;
|
||||
info->dram_channel_width_bytes = (1 << info_v30->channel_width) / 8;
|
||||
/* As suggested by VBIOS we should always use
|
||||
* dram_channel_width_bytes = 2 when using VRAM
|
||||
* table version 3.0. This is because the channel_width
|
||||
* param in the VRAM info table is changed in 7000 series and
|
||||
* no longer represents the memory channel width.
|
||||
*/
|
||||
info->dram_channel_width_bytes = 2;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -61,8 +61,12 @@ endif
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_FRAME_WARN),0)
|
||||
ifeq ($(filter y,$(CONFIG_KASAN)$(CONFIG_KCSAN)),y)
|
||||
frame_warn_flag := -Wframe-larger-than=3072
|
||||
else
|
||||
frame_warn_flag := -Wframe-larger-than=2048
|
||||
endif
|
||||
endif
|
||||
|
||||
CFLAGS_$(AMDDALPATH)/dc/dml/display_mode_lib.o := $(dml_ccflags)
|
||||
CFLAGS_$(AMDDALPATH)/dc/dml/display_mode_vba.o := $(dml_ccflags)
|
||||
|
@ -9447,12 +9447,12 @@ void dml_core_mode_programming(struct display_mode_lib_st *mode_lib, const struc
|
||||
|
||||
// Output
|
||||
CalculateWatermarks_params->Watermark = &s->dummy_watermark; // Watermarks *Watermark
|
||||
CalculateWatermarks_params->DRAMClockChangeSupport = &mode_lib->ms.support.DRAMClockChangeSupport[j];
|
||||
CalculateWatermarks_params->DRAMClockChangeSupport = &mode_lib->ms.support.DRAMClockChangeSupport[0];
|
||||
CalculateWatermarks_params->MaxActiveDRAMClockChangeLatencySupported = &s->dummy_single_array[0][0]; // dml_float_t *MaxActiveDRAMClockChangeLatencySupported[]
|
||||
CalculateWatermarks_params->SubViewportLinesNeededInMALL = &mode_lib->ms.SubViewportLinesNeededInMALL[j]; // dml_uint_t SubViewportLinesNeededInMALL[]
|
||||
CalculateWatermarks_params->FCLKChangeSupport = &mode_lib->ms.support.FCLKChangeSupport[j];
|
||||
CalculateWatermarks_params->FCLKChangeSupport = &mode_lib->ms.support.FCLKChangeSupport[0];
|
||||
CalculateWatermarks_params->MaxActiveFCLKChangeLatencySupported = &s->dummy_single[0]; // dml_float_t *MaxActiveFCLKChangeLatencySupported
|
||||
CalculateWatermarks_params->USRRetrainingSupport = &mode_lib->ms.support.USRRetrainingSupport[j];
|
||||
CalculateWatermarks_params->USRRetrainingSupport = &mode_lib->ms.support.USRRetrainingSupport[0];
|
||||
|
||||
CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport(
|
||||
&mode_lib->scratch,
|
||||
|
@ -1085,6 +1085,10 @@ struct gpu_metrics_v3_0 {
|
||||
uint16_t average_dram_reads;
|
||||
/* time filtered DRAM write bandwidth [MB/sec] */
|
||||
uint16_t average_dram_writes;
|
||||
/* time filtered IPU read bandwidth [MB/sec] */
|
||||
uint16_t average_ipu_reads;
|
||||
/* time filtered IPU write bandwidth [MB/sec] */
|
||||
uint16_t average_ipu_writes;
|
||||
|
||||
/* Driver attached timestamp (in ns) */
|
||||
uint64_t system_clock_counter;
|
||||
@ -1104,6 +1108,8 @@ struct gpu_metrics_v3_0 {
|
||||
uint32_t average_all_core_power;
|
||||
/* calculated core power [mW] */
|
||||
uint16_t average_core_power[16];
|
||||
/* time filtered total system power [mW] */
|
||||
uint16_t average_sys_power;
|
||||
/* maximum IRM defined STAPM power limit [mW] */
|
||||
uint16_t stapm_power_limit;
|
||||
/* time filtered STAPM power limit [mW] */
|
||||
@ -1116,6 +1122,8 @@ struct gpu_metrics_v3_0 {
|
||||
uint16_t average_ipuclk_frequency;
|
||||
uint16_t average_fclk_frequency;
|
||||
uint16_t average_vclk_frequency;
|
||||
uint16_t average_uclk_frequency;
|
||||
uint16_t average_mpipu_frequency;
|
||||
|
||||
/* Current clocks */
|
||||
/* target core frequency [MHz] */
|
||||
@ -1125,6 +1133,15 @@ struct gpu_metrics_v3_0 {
|
||||
/* GFXCLK frequency limit enforced on GFX [MHz] */
|
||||
uint16_t current_gfx_maxfreq;
|
||||
|
||||
/* Throttle Residency (ASIC dependent) */
|
||||
uint32_t throttle_residency_prochot;
|
||||
uint32_t throttle_residency_spl;
|
||||
uint32_t throttle_residency_fppt;
|
||||
uint32_t throttle_residency_sppt;
|
||||
uint32_t throttle_residency_thm_core;
|
||||
uint32_t throttle_residency_thm_gfx;
|
||||
uint32_t throttle_residency_thm_soc;
|
||||
|
||||
/* Metrics table alpha filter time constant [us] */
|
||||
uint32_t time_filter_alphavalue;
|
||||
};
|
||||
|
@ -1408,6 +1408,16 @@ typedef enum {
|
||||
METRICS_PCIE_WIDTH,
|
||||
METRICS_CURR_FANPWM,
|
||||
METRICS_CURR_SOCKETPOWER,
|
||||
METRICS_AVERAGE_VPECLK,
|
||||
METRICS_AVERAGE_IPUCLK,
|
||||
METRICS_AVERAGE_MPIPUCLK,
|
||||
METRICS_THROTTLER_RESIDENCY_PROCHOT,
|
||||
METRICS_THROTTLER_RESIDENCY_SPL,
|
||||
METRICS_THROTTLER_RESIDENCY_FPPT,
|
||||
METRICS_THROTTLER_RESIDENCY_SPPT,
|
||||
METRICS_THROTTLER_RESIDENCY_THM_CORE,
|
||||
METRICS_THROTTLER_RESIDENCY_THM_GFX,
|
||||
METRICS_THROTTLER_RESIDENCY_THM_SOC,
|
||||
} MetricsMember_t;
|
||||
|
||||
enum smu_cmn2asic_mapping_type {
|
||||
|
@ -27,7 +27,7 @@
|
||||
// *** IMPORTANT ***
|
||||
// SMU TEAM: Always increment the interface version if
|
||||
// any structure is changed in this file
|
||||
#define PMFW_DRIVER_IF_VERSION 6
|
||||
#define PMFW_DRIVER_IF_VERSION 7
|
||||
|
||||
typedef struct {
|
||||
int32_t value;
|
||||
@ -150,37 +150,50 @@ typedef struct {
|
||||
} DpmClocks_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t CoreFrequency[16]; //Target core frequency [MHz]
|
||||
uint16_t CorePower[16]; //CAC calculated core power [mW]
|
||||
uint16_t CoreTemperature[16]; //TSEN measured core temperature [centi-C]
|
||||
uint16_t GfxTemperature; //TSEN measured GFX temperature [centi-C]
|
||||
uint16_t SocTemperature; //TSEN measured SOC temperature [centi-C]
|
||||
uint16_t StapmOpnLimit; //Maximum IRM defined STAPM power limit [mW]
|
||||
uint16_t StapmCurrentLimit; //Time filtered STAPM power limit [mW]
|
||||
uint16_t InfrastructureCpuMaxFreq; //CCLK frequency limit enforced on classic cores [MHz]
|
||||
uint16_t InfrastructureGfxMaxFreq; //GFXCLK frequency limit enforced on GFX [MHz]
|
||||
uint16_t SkinTemp; //Maximum skin temperature reported by APU and HS2 chassis sensors [centi-C]
|
||||
uint16_t GfxclkFrequency; //Time filtered target GFXCLK frequency [MHz]
|
||||
uint16_t FclkFrequency; //Time filtered target FCLK frequency [MHz]
|
||||
uint16_t GfxActivity; //Time filtered GFX busy % [0-100]
|
||||
uint16_t SocclkFrequency; //Time filtered target SOCCLK frequency [MHz]
|
||||
uint16_t VclkFrequency; //Time filtered target VCLK frequency [MHz]
|
||||
uint16_t VcnActivity; //Time filtered VCN busy % [0-100]
|
||||
uint16_t VpeclkFrequency; //Time filtered target VPECLK frequency [MHz]
|
||||
uint16_t IpuclkFrequency; //Time filtered target IPUCLK frequency [MHz]
|
||||
uint16_t IpuBusy[8]; //Time filtered IPU per-column busy % [0-100]
|
||||
uint16_t DRAMReads; //Time filtered DRAM read bandwidth [MB/sec]
|
||||
uint16_t DRAMWrites; //Time filtered DRAM write bandwidth [MB/sec]
|
||||
uint16_t CoreC0Residency[16]; //Time filtered per-core C0 residency % [0-100]
|
||||
uint16_t IpuPower; //Time filtered IPU power [mW]
|
||||
uint32_t ApuPower; //Time filtered APU power [mW]
|
||||
uint32_t GfxPower; //Time filtered GFX power [mW]
|
||||
uint32_t dGpuPower; //Time filtered dGPU power [mW]
|
||||
uint32_t SocketPower; //Time filtered power used for PPT/STAPM [APU+dGPU] [mW]
|
||||
uint32_t AllCorePower; //Time filtered sum of core power across all cores in the socket [mW]
|
||||
uint32_t FilterAlphaValue; //Metrics table alpha filter time constant [us]
|
||||
uint32_t MetricsCounter; //Counter that is incremented on every metrics table update [PM_TIMER cycles]
|
||||
uint32_t spare[16];
|
||||
uint16_t CoreFrequency[16]; //Target core frequency [MHz]
|
||||
uint16_t CorePower[16]; //CAC calculated core power [mW]
|
||||
uint16_t CoreTemperature[16]; //TSEN measured core temperature [centi-C]
|
||||
uint16_t GfxTemperature; //TSEN measured GFX temperature [centi-C]
|
||||
uint16_t SocTemperature; //TSEN measured SOC temperature [centi-C]
|
||||
uint16_t StapmOpnLimit; //Maximum IRM defined STAPM power limit [mW]
|
||||
uint16_t StapmCurrentLimit; //Time filtered STAPM power limit [mW]
|
||||
uint16_t InfrastructureCpuMaxFreq; //CCLK frequency limit enforced on classic cores [MHz]
|
||||
uint16_t InfrastructureGfxMaxFreq; //GFXCLK frequency limit enforced on GFX [MHz]
|
||||
uint16_t SkinTemp; //Maximum skin temperature reported by APU and HS2 chassis sensors [centi-C]
|
||||
uint16_t GfxclkFrequency; //Time filtered target GFXCLK frequency [MHz]
|
||||
uint16_t FclkFrequency; //Time filtered target FCLK frequency [MHz]
|
||||
uint16_t GfxActivity; //Time filtered GFX busy % [0-100]
|
||||
uint16_t SocclkFrequency; //Time filtered target SOCCLK frequency [MHz]
|
||||
uint16_t VclkFrequency; //Time filtered target VCLK frequency [MHz]
|
||||
uint16_t VcnActivity; //Time filtered VCN busy % [0-100]
|
||||
uint16_t VpeclkFrequency; //Time filtered target VPECLK frequency [MHz]
|
||||
uint16_t IpuclkFrequency; //Time filtered target IPUCLK frequency [MHz]
|
||||
uint16_t IpuBusy[8]; //Time filtered IPU per-column busy % [0-100]
|
||||
uint16_t DRAMReads; //Time filtered DRAM read bandwidth [MB/sec]
|
||||
uint16_t DRAMWrites; //Time filtered DRAM write bandwidth [MB/sec]
|
||||
uint16_t CoreC0Residency[16]; //Time filtered per-core C0 residency % [0-100]
|
||||
uint16_t IpuPower; //Time filtered IPU power [mW]
|
||||
uint32_t ApuPower; //Time filtered APU power [mW]
|
||||
uint32_t GfxPower; //Time filtered GFX power [mW]
|
||||
uint32_t dGpuPower; //Time filtered dGPU power [mW]
|
||||
uint32_t SocketPower; //Time filtered power used for PPT/STAPM [APU+dGPU] [mW]
|
||||
uint32_t AllCorePower; //Time filtered sum of core power across all cores in the socket [mW]
|
||||
uint32_t FilterAlphaValue; //Metrics table alpha filter time constant [us]
|
||||
uint32_t MetricsCounter; //Counter that is incremented on every metrics table update [PM_TIMER cycles]
|
||||
uint16_t MemclkFrequency; //Time filtered target MEMCLK frequency [MHz]
|
||||
uint16_t MpipuclkFrequency; //Time filtered target MPIPUCLK frequency [MHz]
|
||||
uint16_t IpuReads; //Time filtered IPU read bandwidth [MB/sec]
|
||||
uint16_t IpuWrites; //Time filtered IPU write bandwidth [MB/sec]
|
||||
uint32_t ThrottleResidency_PROCHOT; //Counter that is incremented on every metrics table update when PROCHOT was engaged [PM_TIMER cycles]
|
||||
uint32_t ThrottleResidency_SPL; //Counter that is incremented on every metrics table update when SPL was engaged [PM_TIMER cycles]
|
||||
uint32_t ThrottleResidency_FPPT; //Counter that is incremented on every metrics table update when fast PPT was engaged [PM_TIMER cycles]
|
||||
uint32_t ThrottleResidency_SPPT; //Counter that is incremented on every metrics table update when slow PPT was engaged [PM_TIMER cycles]
|
||||
uint32_t ThrottleResidency_THM_CORE; //Counter that is incremented on every metrics table update when CORE thermal throttling was engaged [PM_TIMER cycles]
|
||||
uint32_t ThrottleResidency_THM_GFX; //Counter that is incremented on every metrics table update when GFX thermal throttling was engaged [PM_TIMER cycles]
|
||||
uint32_t ThrottleResidency_THM_SOC; //Counter that is incremented on every metrics table update when SOC thermal throttling was engaged [PM_TIMER cycles]
|
||||
uint16_t Psys; //Time filtered Psys power [mW]
|
||||
uint16_t spare1;
|
||||
uint32_t spare[6];
|
||||
} SmuMetrics_t;
|
||||
|
||||
//ISP tile definitions
|
||||
|
@ -2593,13 +2593,20 @@ static bool mca_gfx_smu_bank_is_valid(const struct mca_ras_info *mca_ras, struct
|
||||
static bool mca_smu_bank_is_valid(const struct mca_ras_info *mca_ras, struct amdgpu_device *adev,
|
||||
enum amdgpu_mca_error_type type, struct mca_bank_entry *entry)
|
||||
{
|
||||
struct smu_context *smu = adev->powerplay.pp_handle;
|
||||
uint32_t errcode, instlo;
|
||||
|
||||
instlo = REG_GET_FIELD(entry->regs[MCA_REG_IDX_IPID], MCMP1_IPIDT0, InstanceIdLo);
|
||||
if (instlo != 0x03b30400)
|
||||
return false;
|
||||
|
||||
errcode = REG_GET_FIELD(entry->regs[MCA_REG_IDX_STATUS], MCMP1_STATUST0, ErrorCode);
|
||||
if (!(adev->flags & AMD_IS_APU) && smu->smc_fw_version >= 0x00555600) {
|
||||
errcode = MCA_REG__SYND__ERRORINFORMATION(entry->regs[MCA_REG_IDX_SYND]);
|
||||
errcode &= 0xff;
|
||||
} else {
|
||||
errcode = REG_GET_FIELD(entry->regs[MCA_REG_IDX_STATUS], MCMP1_STATUST0, ErrorCode);
|
||||
}
|
||||
|
||||
return mca_smu_check_error_code(adev, mca_ras, errcode);
|
||||
}
|
||||
|
||||
|
@ -246,11 +246,20 @@ static int smu_v14_0_0_get_smu_metrics_data(struct smu_context *smu,
|
||||
*value = 0;
|
||||
break;
|
||||
case METRICS_AVERAGE_UCLK:
|
||||
*value = 0;
|
||||
*value = metrics->MemclkFrequency;
|
||||
break;
|
||||
case METRICS_AVERAGE_FCLK:
|
||||
*value = metrics->FclkFrequency;
|
||||
break;
|
||||
case METRICS_AVERAGE_VPECLK:
|
||||
*value = metrics->VpeclkFrequency;
|
||||
break;
|
||||
case METRICS_AVERAGE_IPUCLK:
|
||||
*value = metrics->IpuclkFrequency;
|
||||
break;
|
||||
case METRICS_AVERAGE_MPIPUCLK:
|
||||
*value = metrics->MpipuclkFrequency;
|
||||
break;
|
||||
case METRICS_AVERAGE_GFXACTIVITY:
|
||||
*value = metrics->GfxActivity / 100;
|
||||
break;
|
||||
@ -270,8 +279,26 @@ static int smu_v14_0_0_get_smu_metrics_data(struct smu_context *smu,
|
||||
*value = metrics->SocTemperature / 100 *
|
||||
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
||||
break;
|
||||
case METRICS_THROTTLER_STATUS:
|
||||
*value = 0;
|
||||
case METRICS_THROTTLER_RESIDENCY_PROCHOT:
|
||||
*value = metrics->ThrottleResidency_PROCHOT;
|
||||
break;
|
||||
case METRICS_THROTTLER_RESIDENCY_SPL:
|
||||
*value = metrics->ThrottleResidency_SPL;
|
||||
break;
|
||||
case METRICS_THROTTLER_RESIDENCY_FPPT:
|
||||
*value = metrics->ThrottleResidency_FPPT;
|
||||
break;
|
||||
case METRICS_THROTTLER_RESIDENCY_SPPT:
|
||||
*value = metrics->ThrottleResidency_SPPT;
|
||||
break;
|
||||
case METRICS_THROTTLER_RESIDENCY_THM_CORE:
|
||||
*value = metrics->ThrottleResidency_THM_CORE;
|
||||
break;
|
||||
case METRICS_THROTTLER_RESIDENCY_THM_GFX:
|
||||
*value = metrics->ThrottleResidency_THM_GFX;
|
||||
break;
|
||||
case METRICS_THROTTLER_RESIDENCY_THM_SOC:
|
||||
*value = metrics->ThrottleResidency_THM_SOC;
|
||||
break;
|
||||
case METRICS_VOLTAGE_VDDGFX:
|
||||
*value = 0;
|
||||
@ -498,6 +525,8 @@ static ssize_t smu_v14_0_0_get_gpu_metrics(struct smu_context *smu,
|
||||
sizeof(uint16_t) * 16);
|
||||
gpu_metrics->average_dram_reads = metrics.DRAMReads;
|
||||
gpu_metrics->average_dram_writes = metrics.DRAMWrites;
|
||||
gpu_metrics->average_ipu_reads = metrics.IpuReads;
|
||||
gpu_metrics->average_ipu_writes = metrics.IpuWrites;
|
||||
|
||||
gpu_metrics->average_socket_power = metrics.SocketPower;
|
||||
gpu_metrics->average_ipu_power = metrics.IpuPower;
|
||||
@ -505,6 +534,7 @@ static ssize_t smu_v14_0_0_get_gpu_metrics(struct smu_context *smu,
|
||||
gpu_metrics->average_gfx_power = metrics.GfxPower;
|
||||
gpu_metrics->average_dgpu_power = metrics.dGpuPower;
|
||||
gpu_metrics->average_all_core_power = metrics.AllCorePower;
|
||||
gpu_metrics->average_sys_power = metrics.Psys;
|
||||
memcpy(&gpu_metrics->average_core_power[0],
|
||||
&metrics.CorePower[0],
|
||||
sizeof(uint16_t) * 16);
|
||||
@ -515,6 +545,8 @@ static ssize_t smu_v14_0_0_get_gpu_metrics(struct smu_context *smu,
|
||||
gpu_metrics->average_fclk_frequency = metrics.FclkFrequency;
|
||||
gpu_metrics->average_vclk_frequency = metrics.VclkFrequency;
|
||||
gpu_metrics->average_ipuclk_frequency = metrics.IpuclkFrequency;
|
||||
gpu_metrics->average_uclk_frequency = metrics.MemclkFrequency;
|
||||
gpu_metrics->average_mpipu_frequency = metrics.MpipuclkFrequency;
|
||||
|
||||
memcpy(&gpu_metrics->current_coreclk[0],
|
||||
&metrics.CoreFrequency[0],
|
||||
@ -522,6 +554,14 @@ static ssize_t smu_v14_0_0_get_gpu_metrics(struct smu_context *smu,
|
||||
gpu_metrics->current_core_maxfreq = metrics.InfrastructureCpuMaxFreq;
|
||||
gpu_metrics->current_gfx_maxfreq = metrics.InfrastructureGfxMaxFreq;
|
||||
|
||||
gpu_metrics->throttle_residency_prochot = metrics.ThrottleResidency_PROCHOT;
|
||||
gpu_metrics->throttle_residency_spl = metrics.ThrottleResidency_SPL;
|
||||
gpu_metrics->throttle_residency_fppt = metrics.ThrottleResidency_FPPT;
|
||||
gpu_metrics->throttle_residency_sppt = metrics.ThrottleResidency_SPPT;
|
||||
gpu_metrics->throttle_residency_thm_core = metrics.ThrottleResidency_THM_CORE;
|
||||
gpu_metrics->throttle_residency_thm_gfx = metrics.ThrottleResidency_THM_GFX;
|
||||
gpu_metrics->throttle_residency_thm_soc = metrics.ThrottleResidency_THM_SOC;
|
||||
|
||||
gpu_metrics->time_filter_alphavalue = metrics.FilterAlphaValue;
|
||||
gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user