Re: [PATCH v6 02/12] PCI/ACPI: Add PERST# Assertion Delay _DSM method

Nilawar, Badal
2026-01-14T13:48:06Z

On 13-01-2026 22:34, Manivannan Sadhasivam wrote:
> On Tue, Jan 13, 2026 at 10:12:03PM +0530, Badal Nilawar wrote:
>> From: Anshuman Gupta <anshuman.gupta@intel.com>
>>
>> Implement _DSM Method 0Bh as per PCI Firmware r3.3, sec 4.6.10, to request
> 4.6.11
I will fix this.
>
>> fixed delay in timing between the time the PME_TO_Ack message is received
>> at the PCI Express Downstream Port that originated the PME_Turn_Off
>> message, and the time the platform asserts PERST# to the slot during the
>> corresponding Endpoint’s or PCI Express Upstream Port’s transition to
>> D3cold while the system is in an ACPI operational state.
>> Host platform supporting this feature ensures that device is observing
>> this delay in every applicable D3Cold transition.
>>
>> Co-developed-by: Badal Nilawar <badal.nilawar@intel.com>
>> Signed-off-by: Badal Nilawar <badal.nilawar@intel.com>
>> Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
>> ---
>> For VRSR feature with PERST# Assertion delay device will get enough time
>> to transition to auxiliary power before main power removal.
>> ---
>> drivers/pci/pci-acpi.c | 60 ++++++++++++++++++++++++++++++++++++++++
>> include/linux/pci-acpi.h | 9 +++++-
>> 2 files changed, 68 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
>> index 645d3005ba50..73eaee20a270 100644
>> --- a/drivers/pci/pci-acpi.c
>> +++ b/drivers/pci/pci-acpi.c
>> @@ -1554,6 +1554,66 @@ int pci_acpi_request_d3cold_aux_power(struct pci_dev *dev, u32 requested_mw,
>> }
>> EXPORT_SYMBOL_GPL(pci_acpi_request_d3cold_aux_power);
>>
>> +/**
>> + * pci_acpi_add_perst_assertion_delay - Request PERST# Delay via ACPI DSM
> I'd name the API as "pci_acpi_set_perst_assertion_delay", but the firmware spec
> calls the _DSM as 'Add PERST# Assertion Delay", so I guess it is fine.
>
> But the description should be changed to "Add PERST# assertion delay via ACPI DSM"
Sure.
>
>> + * @dev: PCI device instance
>> + * @delay_us: Requested delay_us
> "Delay to be added"?
Ok.
>
>> + *
>> + * Request PERST# Assertion Delay to platform firmware, via Root Port/
> Here also.
Ok.
>
>> + * Switch Downstream Port ACPI _DSM Function 0Bh, for the specified
>> + * PCI device.
>> + * Evaluate the _DSM and handle the response accordingly.
>> + *
>> + * Return: returns 0 on success and errno on failure.
>> + */
>> +int pci_acpi_add_perst_assertion_delay(struct pci_dev *dev, u32 delay_us)
>> +{
>> + union acpi_object in_obj = {
>> + .integer.type = ACPI_TYPE_INTEGER,
>> + .integer.value = delay_us,
>> + };
>> +
>> + union acpi_object *out_obj;
>> + int result, ret = -EINVAL;
>> + struct pci_dev *bdev;
>> + acpi_handle handle;
>> +
>> + if (!dev)
>> + return -EINVAL;
>> +
>> + for (bdev = dev; bdev; bdev = pci_upstream_bridge(bdev)) {
>> + handle = ACPI_HANDLE(&bdev->dev);
>> + if (handle &&
>> + acpi_check_dsm(handle, &pci_acpi_dsm_guid, 4,
>> + 1 << DSM_PCI_PERST_ASSERTION_DELAY))
>> + break;
>> + }
>> +
>> + if (!bdev)
>> + return -ENODEV;
>> +
>> + out_obj = acpi_evaluate_dsm_typed(ACPI_HANDLE(&bdev->dev),
>> + &pci_acpi_dsm_guid, 4,
>> + DSM_PCI_PERST_ASSERTION_DELAY,
>> + &in_obj, ACPI_TYPE_INTEGER);
>> + if (!out_obj)
>> + return -EINVAL;
>> +
>> + result = out_obj->integer.value;
>> + ACPI_FREE(out_obj);
>> +
>> + if (result == delay_us) {
>> + pci_info(dev, "PERST# Assertion Delay set to %u microseconds\n", delay_us);
>> + ret = 0;
>> + } else {
>> + pci_info(dev, "PERST# Assertion Delay request failed, using %u microseconds\n",
>> + result);
>> + }
> How about:
>
> if (result != delay_us) {
> pci_warn(dev, "PERST# Assertion Delay request failed, using %u microseconds\n",
> result);

Kept pci_info as the delay request might not always be honored, and it's
up to the caller to handle the return appropriately.
For instance, in the case of VRSR, if the delay request fails, VRSR
won't be enabled.

Thanks,
Badal

> return -EINVAL;
> }
>
> pci_info(dev, "PERST# Assertion Delay set to %u microseconds\n", delay_us);
>
> return 0;
>
> - Mani
>