Re: [PATCH v3 4/5] platform/x86/amd/pmf: Switch to platform_get_resource() and devm_ioremap_resource()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 10/23/2024 19:35, Mario Limonciello wrote:
> On 10/23/2024 01:32, Shyam Sundar S K wrote:
>> Use platform_get_resource() to fetch the memory resource instead of
>> acpi_walk_resources() and devm_ioremap_resource() for mapping the
>> resources.
>>
>> PS: We cannot use resource_size() here because it adds an extra byte
>> to round
>> off the size. In the case of PMF ResourceTemplate(), this rounding is
>> already handled within the _CRS. Using resource_size() would
>> increase the
>> resource size by 1, causing a mismatch with the length field and
>> leading
>> to issues. Therefore, simply use end-start of the ACPI resource to
>> obtain
>> the actual length.
>>
>> Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@xxxxxxx>
>> Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@xxxxxxx>
>> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@xxxxxxx>
>> ---
>>   drivers/platform/x86/amd/pmf/Kconfig  |  1 +
>>   drivers/platform/x86/amd/pmf/acpi.c   | 46
>> +++++++++++----------------
>>   drivers/platform/x86/amd/pmf/pmf.h    |  6 ++--
>>   drivers/platform/x86/amd/pmf/tee-if.c |  8 ++---
>>   4 files changed, 28 insertions(+), 33 deletions(-)
>>
>> diff --git a/drivers/platform/x86/amd/pmf/Kconfig
>> b/drivers/platform/x86/amd/pmf/Kconfig
>> index f4fa8bd8bda8..99d67cdbd91e 100644
>> --- a/drivers/platform/x86/amd/pmf/Kconfig
>> +++ b/drivers/platform/x86/amd/pmf/Kconfig
>> @@ -11,6 +11,7 @@ config AMD_PMF
>>       select ACPI_PLATFORM_PROFILE
>>       depends on TEE && AMDTEE
>>       depends on AMD_SFH_HID
>> +    depends on HAS_IOMEM
>>       help
>>         This driver provides support for the AMD Platform Management
>> Framework.
>>         The goal is to enhance end user experience by making AMD PCs
>> smarter,
>> diff --git a/drivers/platform/x86/amd/pmf/acpi.c
>> b/drivers/platform/x86/amd/pmf/acpi.c
>> index d5b496433d69..62f984fe40c6 100644
>> --- a/drivers/platform/x86/amd/pmf/acpi.c
>> +++ b/drivers/platform/x86/amd/pmf/acpi.c
>> @@ -433,37 +433,29 @@ int apmf_install_handler(struct amd_pmf_dev
>> *pmf_dev)
>>       return 0;
>>   }
>>   -static acpi_status apmf_walk_resources(struct acpi_resource *res,
>> void *data)
>> +int apmf_check_smart_pc(struct amd_pmf_dev *pmf_dev)
>>   {
>> -    struct amd_pmf_dev *dev = data;
>> +    struct platform_device *pdev = to_platform_device(pmf_dev->dev);
>>   -    switch (res->type) {
>> -    case ACPI_RESOURCE_TYPE_ADDRESS64:
>> -        dev->policy_addr = res->data.address64.address.minimum;
>> -        dev->policy_sz = res->data.address64.address.address_length;
>> -        break;
>> -    case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
>> -        dev->policy_addr = res->data.fixed_memory32.address;
>> -        dev->policy_sz = res->data.fixed_memory32.address_length;
>> -        break;
>> -    }
>> -
>> -    if (!dev->policy_addr || dev->policy_sz > POLICY_BUF_MAX_SZ ||
>> dev->policy_sz == 0) {
>> -        pr_err("Incorrect Policy params, possibly a SBIOS bug\n");
>> -        return AE_ERROR;
>> +    pmf_dev->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> +    if (!pmf_dev->res) {
>> +        dev_err(pmf_dev->dev, "Failed to get I/O memory resource\n");

here        ^^^^^^^

>> +        return -EINVAL;
>>       }
>>   -    return AE_OK;
>> -}
>> -
>> -int apmf_check_smart_pc(struct amd_pmf_dev *pmf_dev)
>> -{
>> -    acpi_handle ahandle = ACPI_HANDLE(pmf_dev->dev);
>> -    acpi_status status;
>> -
>> -    status = acpi_walk_resources(ahandle, METHOD_NAME__CRS,
>> apmf_walk_resources, pmf_dev);
>> -    if (ACPI_FAILURE(status)) {
>> -        dev_dbg(pmf_dev->dev, "acpi_walk_resources failed :%d\n",
>> status);
>> +    pmf_dev->policy_addr = pmf_dev->res->start;
>> +    /*
>> +     * We cannot use resource_size() here because it adds an extra
>> byte to round off the size.
>> +     * In the case of PMF ResourceTemplate(), this rounding is
>> already handled within the _CRS.
>> +     * Using resource_size() would increase the resource size by 1,
>> causing a mismatch with the
>> +     * length field and leading to issues. Therefore, simply use
>> end-start of the ACPI resource
>> +     * to obtain the actual length.
>> +     */
>> +    pmf_dev->policy_sz = pmf_dev->res->end - pmf_dev->res->start;
>> +
>> +    if (!pmf_dev->policy_addr || pmf_dev->policy_sz >
>> POLICY_BUF_MAX_SZ ||
>> +        pmf_dev->policy_sz == 0) {
>> +        dev_err(pmf_dev->dev, "Incorrect policy params, possibly a
>> SBIOS bug\n");
> 
> This upgrades the previous message from debug to error.

It is dev_err() even before this change.

> 
> TL;DR I feel this error should stay as dev_dbg() if no function checks
> are present for Smart PC.
> 
> I don't think it's necessarily an error though.
> Smart PC checks are a bit different than the other checks.  There
> isn't a check for a bit being set to indicate the function is supported.
> 
> So if the BIOS has the declaration for the region but it's not
> populated it might not have a Smart PC policy and this shouldn't be
> reported as a BIOS bug.

This should be included in the CPM package, and the BIOS team is
responsible for packaging a policy binary.


[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux