All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mario Limonciello <mario.limonciello@amd.com>
To: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>,
	hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com
Cc: platform-driver-x86@vger.kernel.org, Patil.Reddy@amd.com
Subject: Re: [PATCH] platform/x86/amd/pmf: Enable Custom BIOS Inputs for PMF-TA
Date: Thu, 5 Dec 2024 13:15:02 -0600	[thread overview]
Message-ID: <060725b0-2dcb-400a-beea-fa574705125a@amd.com> (raw)
In-Reply-To: <20241205101937.2547351-1-Shyam-sundar.S-k@amd.com>

On 12/5/2024 04:19, Shyam Sundar S K wrote:
> Introduce support for passing custom BIOS inputs to the PMF-TA to assess
> BIOS input policy conditions. The PMF driver will adjust system settings
> based on these BIOS input conditions and their corresponding output
> actions.
> 
> Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@amd.com>
> Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@amd.com>
> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>

Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>

I do have one suggestion for a follow up to consider.

> ---
>   drivers/platform/x86/amd/pmf/acpi.c | 24 ++++++++++++++++++++++++
>   drivers/platform/x86/amd/pmf/pmf.h  | 15 ++++++++++++++-
>   drivers/platform/x86/amd/pmf/spc.c  | 24 ++++++++++++++++++++++++
>   3 files changed, 62 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/platform/x86/amd/pmf/acpi.c b/drivers/platform/x86/amd/pmf/acpi.c
> index 1b9c7acf0ddf..21ccd677ffa4 100644
> --- a/drivers/platform/x86/amd/pmf/acpi.c
> +++ b/drivers/platform/x86/amd/pmf/acpi.c
> @@ -321,6 +321,18 @@ int apmf_get_sbios_requests(struct amd_pmf_dev *pdev, struct apmf_sbios_req *req
>   									 req, sizeof(*req));
>   }
>   
> +static void apmf_event_handler_v2(acpi_handle handle, u32 event, void *data)
> +{
> +	struct amd_pmf_dev *pmf_dev = data;
> +	int ret;
> +
> +	guard(mutex)(&pmf_dev->cb_mutex);
> +
> +	ret = apmf_get_sbios_requests_v2(pmf_dev, &pmf_dev->req);
> +	if (ret)
> +		dev_err(pmf_dev->dev, "Failed to get v2 SBIOS requests: %d\n", ret);
> +}
> +
>   static void apmf_event_handler(acpi_handle handle, u32 event, void *data)
>   {
>   	struct amd_pmf_dev *pmf_dev = data;
> @@ -430,6 +442,15 @@ int apmf_install_handler(struct amd_pmf_dev *pmf_dev)
>   		apmf_event_handler(ahandle, 0, pmf_dev);
>   	}
>   
> +	if (pmf_dev->smart_pc_enabled && pmf_dev->pmf_if_version == PMF_IF_V2) {
> +		status = acpi_install_notify_handler(ahandle, ACPI_ALL_NOTIFY,
> +						     apmf_event_handler_v2, pmf_dev);
> +		if (ACPI_FAILURE(status)) {
> +			dev_err(pmf_dev->dev, "failed to install notify handler for custom BIOS inputs\n");
> +			return -ENODEV;
> +		}
> +	}
> +
>   	return 0;
>   }
>   
> @@ -480,6 +501,9 @@ void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev)
>   	if (is_apmf_func_supported(pmf_dev, APMF_FUNC_AUTO_MODE) &&
>   	    is_apmf_func_supported(pmf_dev, APMF_FUNC_SBIOS_REQUESTS))
>   		acpi_remove_notify_handler(ahandle, ACPI_ALL_NOTIFY, apmf_event_handler);
> +
> +	if (pmf_dev->smart_pc_enabled && pmf_dev->pmf_if_version == PMF_IF_V2)
> +		acpi_remove_notify_handler(ahandle, ACPI_ALL_NOTIFY, apmf_event_handler_v2);
>   }
>   
>   int apmf_acpi_init(struct amd_pmf_dev *pmf_dev)
> diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/x86/amd/pmf/pmf.h
> index a79808fda1d8..255c5ad2300e 100644
> --- a/drivers/platform/x86/amd/pmf/pmf.h
> +++ b/drivers/platform/x86/amd/pmf/pmf.h
> @@ -370,6 +370,8 @@ struct amd_pmf_dev {
>   	struct input_dev *pmf_idev;
>   	size_t mtable_size;
>   	struct resource *res;
> +	struct apmf_sbios_req_v2 req; /* To get custom bios pending request */
> +	struct mutex cb_mutex;
>   };
>   
>   struct apmf_sps_prop_granular_v2 {
> @@ -616,6 +618,16 @@ enum ta_slider {
>   	TA_MAX,
>   };
>   
> +enum apmf_smartpc_custom_bios_inputs {
> +	APMF_SMARTPC_CUSTOM_BIOS_INPUT1,
> +	APMF_SMARTPC_CUSTOM_BIOS_INPUT2,
> +};
> +
> +enum apmf_preq_smartpc {
> +	NOTIFY_CUSTOM_BIOS_INPUT1 = 5,
> +	NOTIFY_CUSTOM_BIOS_INPUT2,
> +};

Maybe as a follow up you should combine these all together in a common 
header:

APMF_AMT_NOTIFICATION
APMF_CQL_NOTIFICATION

> +
>   /* Command ids for TA communication */
>   enum ta_pmf_command {
>   	TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE,
> @@ -657,7 +669,8 @@ struct ta_pmf_condition_info {
>   	u32 power_slider;
>   	u32 lid_state;
>   	bool user_present;
> -	u32 rsvd1[2];
> +	u32 bios_input1;
> +	u32 bios_input2;
>   	u32 monitor_count;
>   	u32 rsvd2[2];
>   	u32 bat_design;
> diff --git a/drivers/platform/x86/amd/pmf/spc.c b/drivers/platform/x86/amd/pmf/spc.c
> index 06226eb0eab3..05bed8206365 100644
> --- a/drivers/platform/x86/amd/pmf/spc.c
> +++ b/drivers/platform/x86/amd/pmf/spc.c
> @@ -47,12 +47,35 @@ void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *
>   	dev_dbg(dev->dev, "LID State: %s\n", in->ev_info.lid_state ? "close" : "open");
>   	dev_dbg(dev->dev, "User Presence: %s\n", in->ev_info.user_present ? "Present" : "Away");
>   	dev_dbg(dev->dev, "Ambient Light: %d\n", in->ev_info.ambient_light);
> +	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);
>   	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
>   
> +static void amd_pmf_get_custom_bios_inputs(struct amd_pmf_dev *pdev,
> +					   struct ta_pmf_enact_table *in)
> +{
> +	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);
> +	}
> +
> +	/* Clear pending requests after handling */
> +	memset(&pdev->req, 0, sizeof(pdev->req));
> +}
> +
>   static void amd_pmf_get_c0_residency(u16 *core_res, size_t size, struct ta_pmf_enact_table *in)
>   {
>   	u16 max, avg = 0;
> @@ -201,4 +224,5 @@ void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_tab
>   	amd_pmf_get_battery_info(dev, in);
>   	amd_pmf_get_slider_info(dev, in);
>   	amd_pmf_get_sensor_info(dev, in);
> +	amd_pmf_get_custom_bios_inputs(dev, in);
>   }


  reply	other threads:[~2024-12-05 19:15 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-05 10:19 [PATCH] platform/x86/amd/pmf: Enable Custom BIOS Inputs for PMF-TA Shyam Sundar S K
2024-12-05 19:15 ` Mario Limonciello [this message]
2024-12-11  3:21   ` Shyam Sundar S K
2024-12-16 17:17 ` Ilpo Järvinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=060725b0-2dcb-400a-beea-fa574705125a@amd.com \
    --to=mario.limonciello@amd.com \
    --cc=Patil.Reddy@amd.com \
    --cc=Shyam-sundar.S-k@amd.com \
    --cc=hdegoede@redhat.com \
    --cc=ilpo.jarvinen@linux.intel.com \
    --cc=platform-driver-x86@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.