Re: [PATCH V2 6/9] PCI/TPH: Retrieve steering tag from ACPI _DSM
From: Wei Huang
Date: Wed Jun 05 2024 - 15:34:24 EST
On 6/4/24 10:30, Simon Horman wrote:
> On Fri, May 31, 2024 at 04:38:38PM -0500, Wei Huang wrote:
>> According to PCI SIG ECN, calling the _DSM firmware method for a given
>> CPU_UID returns the steering tags for different types of memory
>> (volatile, non-volatile). These tags are supposed to be used in ST
>> table entry for optimal results.
>>
>> Co-developed-by: Eric Van Tassell <Eric.VanTassell@xxxxxxx>
>> Signed-off-by: Eric Van Tassell <Eric.VanTassell@xxxxxxx>
>> Signed-off-by: Wei Huang <wei.huang2@xxxxxxx>
>> Reviewed-by: Ajit Khaparde <ajit.khaparde@xxxxxxxxxxxx>
>> Reviewed-by: Somnath Kotur <somnath.kotur@xxxxxxxxxxxx>
>> Reviewed-by: Andy Gospodarek <andrew.gospodarek@xxxxxxxxxxxx>
>
> ...
>
>> diff --git a/drivers/pci/pcie/tph.c b/drivers/pci/pcie/tph.c
>
> ...
>
>> +static bool invoke_dsm(acpi_handle handle, u32 cpu_uid, u8 ph,
>> + u8 target_type, bool cache_ref_valid,
>> + u64 cache_ref, union st_info *st_out)
>> +{
>> + union acpi_object in_obj, in_buf[3], *out_obj;
>> +
>> + in_buf[0].integer.type = ACPI_TYPE_INTEGER;
>> + in_buf[0].integer.value = 0; /* 0 => processor cache steering tags */
>> +
>> + in_buf[1].integer.type = ACPI_TYPE_INTEGER;
>> + in_buf[1].integer.value = cpu_uid;
>> +
>> + in_buf[2].integer.type = ACPI_TYPE_INTEGER;
>> + in_buf[2].integer.value = ph & 3;
>> + in_buf[2].integer.value |= (target_type & 1) << 2;
>> + in_buf[2].integer.value |= (cache_ref_valid & 1) << 3;
>> + in_buf[2].integer.value |= (cache_ref << 32);
>> +
>> + in_obj.type = ACPI_TYPE_PACKAGE;
>> + in_obj.package.count = ARRAY_SIZE(in_buf);
>> + in_obj.package.elements = in_buf;
>> +
>> + out_obj = acpi_evaluate_dsm(handle, &pci_acpi_dsm_guid, MIN_ST_DSM_REV,
>> + ST_DSM_FUNC_INDEX, &in_obj);
>
> Hi Wei Huang, Eric, all,
>
> This seems to break builds on ARM (32bit) with multi_v7_defconfig.
>
> .../tph.c:221:39: error: use of undeclared identifier 'pci_acpi_dsm_guid'
> 221 | out_obj = acpi_evaluate_dsm(handle, &pci_acpi_dsm_guid, MIN_ST_DSM_REV,
> |
Thanks for pointing it out. I will add "depends on ACPI" in Kconfig
which solves the problem:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnu- multi_v7_defconfig zImage
modules
CALL scripts/checksyscalls.sh
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
>
> I suspect a dependency on ACPI in Kconfig is appropriate.
>
>> +
>> + if (!out_obj)
>> + return false;
>> +
>> + if (out_obj->type != ACPI_TYPE_BUFFER) {
>> + pr_err("invalid return type %d from TPH _DSM\n",
>> + out_obj->type);
>> + ACPI_FREE(out_obj);
>> + return false;
>> + }
>
> ...