mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 07:33:19 +02:00
platform/x86/amd/pmf: Fix the custom bios input handling mechanism
Originally, the 'amd_pmf_get_custom_bios_inputs()' function was written under the assumption that the BIOS would only send a single pending request for the driver to process. However, following OEM enablement, it became clear that multiple pending requests for custom BIOS inputs might be sent at the same time, a scenario that the current code logic does not support when it comes to handling multiple custom BIOS inputs. To address this, the code logic needs to be improved to not only manage multiple simultaneous custom BIOS inputs but also to ensure it is scalable for future additional inputs. Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> Tested-by: Yijun Shen <Yijun.Shen@Dell.com> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> Link: https://patch.msgid.link/20250901110140.2519072-3-Shyam-sundar.S-k@amd.com Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
This commit is contained in:
parent
f10ea2df9e
commit
d82e3d2dd0
|
|
@ -623,14 +623,14 @@ enum ta_slider {
|
|||
TA_MAX,
|
||||
};
|
||||
|
||||
enum apmf_smartpc_custom_bios_inputs {
|
||||
APMF_SMARTPC_CUSTOM_BIOS_INPUT1,
|
||||
APMF_SMARTPC_CUSTOM_BIOS_INPUT2,
|
||||
struct amd_pmf_pb_bitmap {
|
||||
const char *name;
|
||||
u32 bit_mask;
|
||||
};
|
||||
|
||||
enum apmf_preq_smartpc {
|
||||
NOTIFY_CUSTOM_BIOS_INPUT1 = 5,
|
||||
NOTIFY_CUSTOM_BIOS_INPUT2,
|
||||
static const struct amd_pmf_pb_bitmap custom_bios_inputs[] __used = {
|
||||
{"NOTIFY_CUSTOM_BIOS_INPUT1", BIT(5)},
|
||||
{"NOTIFY_CUSTOM_BIOS_INPUT2", BIT(6)},
|
||||
};
|
||||
|
||||
enum platform_type {
|
||||
|
|
@ -690,8 +690,7 @@ struct ta_pmf_condition_info {
|
|||
u32 power_slider;
|
||||
u32 lid_state;
|
||||
bool user_present;
|
||||
u32 bios_input1;
|
||||
u32 bios_input2;
|
||||
u32 bios_input_1[2];
|
||||
u32 monitor_count;
|
||||
u32 rsvd2[2];
|
||||
u32 bat_design;
|
||||
|
|
|
|||
|
|
@ -70,8 +70,20 @@ static const char *ta_slider_as_str(unsigned int state)
|
|||
}
|
||||
}
|
||||
|
||||
static u32 amd_pmf_get_ta_custom_bios_inputs(struct ta_pmf_enact_table *in, int index)
|
||||
{
|
||||
switch (index) {
|
||||
case 0 ... 1:
|
||||
return in->ev_info.bios_input_1[index];
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in)
|
||||
{
|
||||
int i;
|
||||
|
||||
dev_dbg(dev->dev, "==== TA inputs START ====\n");
|
||||
dev_dbg(dev->dev, "Slider State: %s\n", ta_slider_as_str(in->ev_info.power_slider));
|
||||
dev_dbg(dev->dev, "Power Source: %s\n", amd_pmf_source_as_str(in->ev_info.power_source));
|
||||
|
|
@ -90,29 +102,43 @@ void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *
|
|||
dev_dbg(dev->dev, "Platform type: %s\n", platform_type_as_str(in->ev_info.platform_type));
|
||||
dev_dbg(dev->dev, "Laptop placement: %s\n",
|
||||
laptop_placement_as_str(in->ev_info.device_state));
|
||||
dev_dbg(dev->dev, "Custom BIOS input1: %u\n", in->ev_info.bios_input1);
|
||||
dev_dbg(dev->dev, "Custom BIOS input2: %u\n", in->ev_info.bios_input2);
|
||||
for (i = 0; i < ARRAY_SIZE(custom_bios_inputs); i++)
|
||||
dev_dbg(dev->dev, "Custom BIOS input%d: %u\n", i + 1,
|
||||
amd_pmf_get_ta_custom_bios_inputs(in, i));
|
||||
dev_dbg(dev->dev, "==== TA inputs END ====\n");
|
||||
}
|
||||
#else
|
||||
void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in) {}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This helper function sets the appropriate BIOS input value in the TA enact
|
||||
* table based on the provided index. We need this approach because the custom
|
||||
* BIOS input array is not continuous, due to the existing TA structure layout.
|
||||
*/
|
||||
static void amd_pmf_set_ta_custom_bios_input(struct ta_pmf_enact_table *in, int index, u32 value)
|
||||
{
|
||||
switch (index) {
|
||||
case 0 ... 1:
|
||||
in->ev_info.bios_input_1[index] = value;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void amd_pmf_get_custom_bios_inputs(struct amd_pmf_dev *pdev,
|
||||
struct ta_pmf_enact_table *in)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!pdev->req.pending_req)
|
||||
return;
|
||||
|
||||
switch (pdev->req.pending_req) {
|
||||
case BIT(NOTIFY_CUSTOM_BIOS_INPUT1):
|
||||
in->ev_info.bios_input1 = pdev->req.custom_policy[APMF_SMARTPC_CUSTOM_BIOS_INPUT1];
|
||||
break;
|
||||
case BIT(NOTIFY_CUSTOM_BIOS_INPUT2):
|
||||
in->ev_info.bios_input2 = pdev->req.custom_policy[APMF_SMARTPC_CUSTOM_BIOS_INPUT2];
|
||||
break;
|
||||
default:
|
||||
dev_dbg(pdev->dev, "Invalid preq for BIOS input: 0x%x\n", pdev->req.pending_req);
|
||||
for (i = 0; i < ARRAY_SIZE(custom_bios_inputs); i++) {
|
||||
if (!(pdev->req.pending_req & custom_bios_inputs[i].bit_mask))
|
||||
continue;
|
||||
amd_pmf_set_ta_custom_bios_input(in, i, pdev->req.custom_policy[i]);
|
||||
}
|
||||
|
||||
/* Clear pending requests after handling */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user