mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
ACPI: PCC: Cache OpRegion command timeout
The PCC OperationRegion handler computes the same command completion wait timeout each time it sends a command. The timeout is derived from static channel properties, so compute it once when the PCC channel is set up and store the millisecond value in the mailbox client timeout field. Use the cached timeout when waiting for the OperationRegion command to complete. This keeps the timeout calculation in one place and avoids recomputing it for every command. Reviewed-by: Huisong Li <lihuisong@huawei.com> Signed-off-by: Sudeep Holla <sudeep.holla@kernel.org> Link: https://patch.msgid.link/20260922144302.3847593-5-sudeep.holla@kernel.org Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
fa9c7ee692
commit
c0232f00f7
|
|
@ -50,10 +50,11 @@ static acpi_status
|
|||
acpi_pcc_address_space_setup(acpi_handle region_handle, u32 function,
|
||||
void *handler_context, void **region_context)
|
||||
{
|
||||
struct pcc_data *data;
|
||||
struct acpi_pcc_info *ctx = handler_context;
|
||||
struct pcc_mbox_chan *pcc_chan;
|
||||
struct pcc_data *data;
|
||||
acpi_status ret;
|
||||
u64 usecs_lat;
|
||||
|
||||
if (function == ACPI_REGION_DEACTIVATE) {
|
||||
data = *region_context;
|
||||
|
|
@ -103,6 +104,16 @@ acpi_pcc_address_space_setup(acpi_handle region_handle, u32 function,
|
|||
goto err_free_channel;
|
||||
}
|
||||
|
||||
/*
|
||||
* pcc_chan->latency is just a Nominal value. In reality the remote
|
||||
* processor could be much slower to reply. So add an arbitrary
|
||||
* amount of wait on top of Nominal.
|
||||
*/
|
||||
usecs_lat = PCC_CMD_WAIT_RETRIES_NUM * pcc_chan->latency;
|
||||
data->cl.tx_tout = DIV_ROUND_UP_ULL(usecs_lat, 1000);
|
||||
if (!data->cl.tx_tout)
|
||||
data->cl.tx_tout = 1;
|
||||
|
||||
*region_context = data;
|
||||
return AE_OK;
|
||||
|
||||
|
|
@ -121,7 +132,6 @@ acpi_pcc_address_space_handler(u32 function, acpi_physical_address addr,
|
|||
{
|
||||
struct pcc_data *data = region_context;
|
||||
void __iomem *pcc_opregion;
|
||||
u64 usecs_lat;
|
||||
int ret;
|
||||
|
||||
pcc_opregion = data->pcc_chan->shmem + PCC_SIGNATURE_SIZE;
|
||||
|
|
@ -135,14 +145,8 @@ acpi_pcc_address_space_handler(u32 function, acpi_physical_address addr,
|
|||
if (ret < 0)
|
||||
return AE_ERROR;
|
||||
|
||||
/*
|
||||
* pcc_chan->latency is just a Nominal value. In reality the remote
|
||||
* processor could be much slower to reply. So add an arbitrary
|
||||
* amount of wait on top of Nominal.
|
||||
*/
|
||||
usecs_lat = PCC_CMD_WAIT_RETRIES_NUM * data->pcc_chan->latency;
|
||||
ret = wait_for_completion_timeout(&data->done,
|
||||
usecs_to_jiffies(usecs_lat));
|
||||
msecs_to_jiffies(data->cl.tx_tout));
|
||||
if (ret == 0) {
|
||||
pr_err("PCC command executed timeout!\n");
|
||||
return AE_TIME;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user