Unverified Commit 62214d94 authored by Shyam Sundar S K's avatar Shyam Sundar S K Committed by Ilpo Järvinen
Browse files

platform/x86/amd/pmf: Call enact function sooner to process early pending requests



Call the amd_pmf_invoke_cmd_enact() function to manage early pending
requests and their associated custom BIOS inputs. Add a return statement
for cases of failure.

The PMF driver will adjust power settings according to custom BIOS inputs
after assessing the policy conditions.

Also, add a new common routine amd_pmf_handle_early_preq() to handle early
BIOS pending requests for both v1 and v2 variants.

Co-developed-by: default avatarPatil Rajesh Reddy <Patil.Reddy@amd.com>
Signed-off-by: default avatarPatil Rajesh Reddy <Patil.Reddy@amd.com>
Tested-by: default avatarYijun Shen <Yijun.Shen@Dell.com>
Signed-off-by: default avatarShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Link: https://patch.msgid.link/20250901110140.2519072-9-Shyam-sundar.S-k@amd.com


Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent b21ec883
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -331,6 +331,15 @@ int apmf_get_sbios_requests(struct amd_pmf_dev *pdev, struct apmf_sbios_req *req
									 req, sizeof(*req));
}

static void amd_pmf_handle_early_preq(struct amd_pmf_dev *pdev)
{
	if (!pdev->cb_flag)
		return;

	amd_pmf_invoke_cmd_enact(pdev);
	pdev->cb_flag = false;
}

static void apmf_event_handler_v2(acpi_handle handle, u32 event, void *data)
{
	struct amd_pmf_dev *pmf_dev = data;
@@ -339,8 +348,12 @@ static void apmf_event_handler_v2(acpi_handle handle, u32 event, void *data)
	guard(mutex)(&pmf_dev->cb_mutex);

	ret = apmf_get_sbios_requests_v2(pmf_dev, &pmf_dev->req);
	if (ret)
	if (ret) {
		dev_err(pmf_dev->dev, "Failed to get v2 SBIOS requests: %d\n", ret);
		return;
	}

	amd_pmf_handle_early_preq(pmf_dev);
}

static void apmf_event_handler_v1(acpi_handle handle, u32 event, void *data)
@@ -351,8 +364,12 @@ static void apmf_event_handler_v1(acpi_handle handle, u32 event, void *data)
	guard(mutex)(&pmf_dev->cb_mutex);

	ret = apmf_get_sbios_requests_v1(pmf_dev, &pmf_dev->req1);
	if (ret)
	if (ret) {
		dev_err(pmf_dev->dev, "Failed to get v1 SBIOS requests: %d\n", ret);
		return;
	}

	amd_pmf_handle_early_preq(pmf_dev);
}

static void apmf_event_handler(acpi_handle handle, u32 event, void *data)
+2 −0
Original line number Diff line number Diff line
@@ -405,6 +405,7 @@ struct amd_pmf_dev {
	u32 notifications;
	struct apmf_sbios_req_v1 req1;
	struct pmf_bios_inputs_prev cb_prev; /* To preserve custom BIOS inputs */
	bool cb_flag;			     /* To handle first custom BIOS input */
};

struct apmf_sps_prop_granular_v2 {
@@ -885,5 +886,6 @@ int amd_pmf_smartpc_apply_bios_output(struct amd_pmf_dev *dev, u32 val, u32 preq
/* Smart PC - TA interfaces */
void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
int amd_pmf_invoke_cmd_enact(struct amd_pmf_dev *dev);

#endif /* PMF_H */
+4 −2
Original line number Diff line number Diff line
@@ -225,7 +225,7 @@ static void amd_pmf_apply_policies(struct amd_pmf_dev *dev, struct ta_pmf_enact_
	}
}

static int amd_pmf_invoke_cmd_enact(struct amd_pmf_dev *dev)
int amd_pmf_invoke_cmd_enact(struct amd_pmf_dev *dev)
{
	struct ta_pmf_shared_memory *ta_sm = NULL;
	struct ta_pmf_enact_result *out = NULL;
@@ -577,8 +577,10 @@ int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev)
		ret = amd_pmf_start_policy_engine(dev);
		dev_dbg(dev->dev, "start policy engine ret: %d\n", ret);
		status = ret == TA_PMF_TYPE_SUCCESS;
		if (status)
		if (status) {
			dev->cb_flag = true;
			break;
		}
		amd_pmf_tee_deinit(dev);
	}