Commit 7f318f4e authored by Likun Gao's avatar Likun Gao Committed by Alex Deucher
Browse files

drm/amdgpu: add tracking for the enablement of SCPM



Add parmeter to shows whether SCPM feature is enabled or not, and
whether is valid.

Signed-off-by: default avatarLikun Gao <Likun.Gao@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a6b6d38e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1016,6 +1016,9 @@ struct amdgpu_device {
	/* reset dump register */
	uint32_t                        *reset_dump_reg_list;
	int                             num_regs;

	bool                            scpm_enabled;
	uint32_t                        scpm_status;
};

static inline struct amdgpu_device *drm_to_adev(struct drm_device *ddev)
+27 −1
Original line number Diff line number Diff line
@@ -282,7 +282,7 @@ static bool psp_get_runtime_db_entry(struct amdgpu_device *adev,
			case PSP_RUNTIME_ENTRY_TYPE_BOOT_CONFIG:
				if (db_dir.entry_list[i].size < sizeof(struct psp_runtime_boot_cfg_entry)) {
					/* invalid db entry size */
					dev_warn(adev->dev, "Invalid PSP runtime database entry size\n");
					dev_warn(adev->dev, "Invalid PSP runtime database boot cfg entry size\n");
					return false;
				}
				/* read runtime database entry */
@@ -290,6 +290,17 @@ static bool psp_get_runtime_db_entry(struct amdgpu_device *adev,
							  (uint32_t *)db_entry, sizeof(struct psp_runtime_boot_cfg_entry), false);
				ret = true;
				break;
			case PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS:
				if (db_dir.entry_list[i].size < sizeof(struct psp_runtime_scpm_entry)) {
					/* invalid db entry size */
					dev_warn(adev->dev, "Invalid PSP runtime database scpm entry size\n");
					return false;
				}
				/* read runtime database entry */
				amdgpu_device_vram_access(adev, db_header_pos + db_dir.entry_list[i].offset,
							  (uint32_t *)db_entry, sizeof(struct psp_runtime_scpm_entry), false);
				ret = true;
				break;
			default:
				ret = false;
				break;
@@ -334,6 +345,7 @@ static int psp_sw_init(void *handle)
	int ret;
	struct psp_runtime_boot_cfg_entry boot_cfg_entry;
	struct psp_memory_training_context *mem_training_ctx = &psp->mem_train_ctx;
	struct psp_runtime_scpm_entry scpm_entry;

	psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
	if (!psp->cmd) {
@@ -354,6 +366,20 @@ static int psp_sw_init(void *handle)
		!adev->gmc.xgmi.connected_to_cpu &&
			adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 2);

	memset(&scpm_entry, 0, sizeof(scpm_entry));
	if ((psp_get_runtime_db_entry(adev,
				PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS,
				&scpm_entry)) &&
	    (SCPM_DISABLE != scpm_entry.scpm_status)) {
		adev->scpm_enabled = true;
		adev->scpm_status = scpm_entry.scpm_status;
	} else {
		adev->scpm_enabled = false;
		adev->scpm_status = SCPM_DISABLE;
	}

	/* TODO: stop gpu driver services and print alarm if scpm is enabled with error status */

	memset(&boot_cfg_entry, 0, sizeof(boot_cfg_entry));
	if (psp_get_runtime_db_entry(adev,
				PSP_RUNTIME_ENTRY_TYPE_BOOT_CONFIG,
+13 −0
Original line number Diff line number Diff line
@@ -244,6 +244,7 @@ enum psp_runtime_entry_type {
	PSP_RUNTIME_ENTRY_TYPE_MGPU_WAFL	= 0x3,  /* WAFL runtime data */
	PSP_RUNTIME_ENTRY_TYPE_MGPU_XGMI	= 0x4,  /* XGMI runtime data */
	PSP_RUNTIME_ENTRY_TYPE_BOOT_CONFIG	= 0x5,  /* Boot Config runtime data */
	PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS = 0x6, /* SCPM validation data */
};

/* PSP runtime DB header */
@@ -278,12 +279,24 @@ enum psp_runtime_boot_cfg_feature {
	BOOT_CFG_FEATURE_TWO_STAGE_DRAM_TRAINING    = 0x2,
};

/* PSP run time DB SCPM authentication defines */
enum psp_runtime_scpm_authentication {
	SCPM_DISABLE                     = 0x0,
	SCPM_ENABLE                      = 0x1,
	SCPM_ENABLE_WITH_SCPM_ERR        = 0x2,
};

/* PSP runtime DB boot config entry */
struct psp_runtime_boot_cfg_entry {
	uint32_t boot_cfg_bitmask;
	uint32_t reserved;
};

/* PSP runtime DB SCPM entry */
struct psp_runtime_scpm_entry {
	enum psp_runtime_scpm_authentication scpm_status;
};

struct psp_context
{
	struct amdgpu_device            *adev;