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

Manivannan Sadhasivam
2026-01-13T17:05:11Z

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

> 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"

> + * @dev: PCI device instance
> + * @delay_us: Requested delay_us

"Delay to be added"?

> + *
> + * Request PERST# Assertion Delay to platform firmware, via Root Port/

Here also.

> + * 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);
return -EINVAL;
}

pci_info(dev, "PERST# Assertion Delay set to %u microseconds\n", delay_us);

return 0;

- Mani

--
மணிவண்ணன் சதாசிவம்