* [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
@ 2021-04-13 6:10 Prike Liang
2021-04-13 6:33 ` Greg KH
0 siblings, 1 reply; 12+ messages in thread
From: Prike Liang @ 2021-04-13 6:10 UTC (permalink / raw)
To: stable, gregkh; +Cc: Alexander.Deucher, Prike Liang, Shyam Sundar S K
The NVME device pluged in some AMD PCIE root port will resume timeout
from s2idle which caused by NVME power CFG lost in the SMU FW restore.
This issue can be workaround by using PCIe power set with simple
suspend/resume process path instead of APST. In the onwards ASIC will
try do the NVME shutdown save and restore in the BIOS and still need PCIe
power setting to resume from RTD3 for s2idle.
Signed-off-by: Prike Liang <Prike.Liang@amd.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Cc: <stable@vger.kernel.org> # 5.11+
---
drivers/nvme/host/pci.c | 5 +++++
drivers/pci/quirks.c | 11 +++++++++++
include/linux/pci.h | 2 ++
include/linux/pci_ids.h | 2 ++
4 files changed, 20 insertions(+)
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 6bad4d4..dd46d9e 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
{
struct acpi_device *adev;
struct pci_dev *root;
+ struct pci_dev *rdev;
acpi_handle handle;
acpi_status status;
u8 val;
@@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
if (!root)
return false;
+ rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
+ if (rdev->dev_flags & PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
+ return NVME_QUIRK_SIMPLE_SUSPEND;
+
adev = ACPI_COMPANION(&root->dev);
if (!adev)
return false;
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 653660e3..b7e19bb 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -312,6 +312,17 @@ static void quirk_nopciamd(struct pci_dev *dev)
}
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8151_0, quirk_nopciamd);
+static void quirk_amd_nvme_fixup(struct pci_dev *dev)
+{
+ struct pci_dev *rdev;
+
+ dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
+ pci_info(dev, "AMD simple suspend opt enabled\n");
+
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CZN_RP, quirk_amd_nvme_fixup);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_RN_RP, quirk_amd_nvme_fixup);
+
/* Triton requires workarounds to be used by the drivers */
static void quirk_triton(struct pci_dev *dev)
{
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 53f4904..a6e1b1b 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -227,6 +227,8 @@ enum pci_dev_flags {
PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
/* Don't use Relaxed Ordering for TLPs directed at this device */
PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11),
+ /* AMD simple suspend opt quirk */
+ PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force pci_dev_flags_t) (1 << 12),
};
enum pci_irq_reroute_variant {
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index d8156a5..7f6340c 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -602,6 +602,8 @@
#define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS 0x780b
#define PCI_DEVICE_ID_AMD_HUDSON2_IDE 0x780c
#define PCI_DEVICE_ID_AMD_KERNCZ_SMBUS 0x790b
+#define PCI_DEVICE_ID_AMD_CZN_RP 0x1630
+#define PCI_DEVICE_ID_AMD_RN_RP PCI_DEVICE_ID_AMD_CZN_RP
#define PCI_VENDOR_ID_TRIDENT 0x1023
#define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX 0x2000
--
2.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
2021-04-13 6:10 Prike Liang
@ 2021-04-13 6:33 ` Greg KH
2021-04-13 6:44 ` Liang, Prike
0 siblings, 1 reply; 12+ messages in thread
From: Greg KH @ 2021-04-13 6:33 UTC (permalink / raw)
To: Prike Liang; +Cc: stable, Alexander.Deucher, Shyam Sundar S K
On Tue, Apr 13, 2021 at 02:10:21PM +0800, Prike Liang wrote:
> The NVME device pluged in some AMD PCIE root port will resume timeout
> from s2idle which caused by NVME power CFG lost in the SMU FW restore.
> This issue can be workaround by using PCIe power set with simple
> suspend/resume process path instead of APST. In the onwards ASIC will
> try do the NVME shutdown save and restore in the BIOS and still need PCIe
> power setting to resume from RTD3 for s2idle.
>
> Signed-off-by: Prike Liang <Prike.Liang@amd.com>
> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> Cc: <stable@vger.kernel.org> # 5.11+
> ---
> drivers/nvme/host/pci.c | 5 +++++
> drivers/pci/quirks.c | 11 +++++++++++
> include/linux/pci.h | 2 ++
> include/linux/pci_ids.h | 2 ++
> 4 files changed, 20 insertions(+)
>
> diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
> index 6bad4d4..dd46d9e 100644
> --- a/drivers/nvme/host/pci.c
> +++ b/drivers/nvme/host/pci.c
> @@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
> {
> struct acpi_device *adev;
> struct pci_dev *root;
> + struct pci_dev *rdev;
> acpi_handle handle;
> acpi_status status;
> u8 val;
> @@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
> if (!root)
> return false;
>
> + rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
> + if (rdev->dev_flags & PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
> + return NVME_QUIRK_SIMPLE_SUSPEND;
> +
> adev = ACPI_COMPANION(&root->dev);
> if (!adev)
> return false;
> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> index 653660e3..b7e19bb 100644
> --- a/drivers/pci/quirks.c
> +++ b/drivers/pci/quirks.c
> @@ -312,6 +312,17 @@ static void quirk_nopciamd(struct pci_dev *dev)
> }
> DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8151_0, quirk_nopciamd);
>
> +static void quirk_amd_nvme_fixup(struct pci_dev *dev)
> +{
> + struct pci_dev *rdev;
> +
> + dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
> + pci_info(dev, "AMD simple suspend opt enabled\n");
> +
> +}
> +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CZN_RP, quirk_amd_nvme_fixup);
> +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_RN_RP, quirk_amd_nvme_fixup);
> +
> /* Triton requires workarounds to be used by the drivers */
> static void quirk_triton(struct pci_dev *dev)
> {
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 53f4904..a6e1b1b 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -227,6 +227,8 @@ enum pci_dev_flags {
> PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
> /* Don't use Relaxed Ordering for TLPs directed at this device */
> PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11),
> + /* AMD simple suspend opt quirk */
> + PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force pci_dev_flags_t) (1 << 12),
> };
>
> enum pci_irq_reroute_variant {
> diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> index d8156a5..7f6340c 100644
> --- a/include/linux/pci_ids.h
> +++ b/include/linux/pci_ids.h
> @@ -602,6 +602,8 @@
> #define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS 0x780b
> #define PCI_DEVICE_ID_AMD_HUDSON2_IDE 0x780c
> #define PCI_DEVICE_ID_AMD_KERNCZ_SMBUS 0x790b
> +#define PCI_DEVICE_ID_AMD_CZN_RP 0x1630
> +#define PCI_DEVICE_ID_AMD_RN_RP PCI_DEVICE_ID_AMD_CZN_RP
If the pci ids are identical, why do you need different entries for it?
Haven't you above just listed the same thing twice in the quirk entry?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 12+ messages in thread
* RE: [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
2021-04-13 6:33 ` Greg KH
@ 2021-04-13 6:44 ` Liang, Prike
2021-04-13 7:00 ` Greg KH
0 siblings, 1 reply; 12+ messages in thread
From: Liang, Prike @ 2021-04-13 6:44 UTC (permalink / raw)
To: Greg KH, Chaitanya Kulkarni
Cc: stable@vger.kernel.org, Deucher, Alexander, S-k, Shyam-sundar
[AMD Public Use]
>
> On Tue, Apr 13, 2021 at 02:10:21PM +0800, Prike Liang wrote:
> > The NVME device pluged in some AMD PCIE root port will resume timeout
> > from s2idle which caused by NVME power CFG lost in the SMU FW restore.
> > This issue can be workaround by using PCIe power set with simple
> > suspend/resume process path instead of APST. In the onwards ASIC will
> > try do the NVME shutdown save and restore in the BIOS and still need
> > PCIe power setting to resume from RTD3 for s2idle.
> >
> > Signed-off-by: Prike Liang <Prike.Liang@amd.com>
> > Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> > Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> > Cc: <stable@vger.kernel.org> # 5.11+
> > ---
> > drivers/nvme/host/pci.c | 5 +++++
> > drivers/pci/quirks.c | 11 +++++++++++
> > include/linux/pci.h | 2 ++
> > include/linux/pci_ids.h | 2 ++
> > 4 files changed, 20 insertions(+)
> >
> > diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index
> > 6bad4d4..dd46d9e 100644
> > --- a/drivers/nvme/host/pci.c
> > +++ b/drivers/nvme/host/pci.c
> > @@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct pci_dev
> > *dev) {
> > struct acpi_device *adev;
> > struct pci_dev *root;
> > +struct pci_dev *rdev;
> > acpi_handle handle;
> > acpi_status status;
> > u8 val;
> > @@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct
> pci_dev *dev)
> > if (!root)
> > return false;
> >
> > +rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
> > +if (rdev->dev_flags &
> PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
> > +return NVME_QUIRK_SIMPLE_SUSPEND;
> > +
> > adev = ACPI_COMPANION(&root->dev);
> > if (!adev)
> > return false;
> > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index
> > 653660e3..b7e19bb 100644
> > --- a/drivers/pci/quirks.c
> > +++ b/drivers/pci/quirks.c
> > @@ -312,6 +312,17 @@ static void quirk_nopciamd(struct pci_dev *dev)
> > }
> > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> PCI_DEVICE_ID_AMD_8151_0,quirk_nopciamd);
> >
> > +static void quirk_amd_nvme_fixup(struct pci_dev *dev) {
> > +struct pci_dev *rdev;
> > +
> > +dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
> > +pci_info(dev, "AMD simple suspend opt enabled\n");
> > +
> > +}
> > +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> PCI_DEVICE_ID_AMD_CZN_RP,
> > +quirk_amd_nvme_fixup);
> DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> > +PCI_DEVICE_ID_AMD_RN_RP, quirk_amd_nvme_fixup);
> > +
> > /* Triton requires workarounds to be used by the drivers */ static
> > void quirk_triton(struct pci_dev *dev) { diff --git
> > a/include/linux/pci.h b/include/linux/pci.h index 53f4904..a6e1b1b
> > 100644
> > --- a/include/linux/pci.h
> > +++ b/include/linux/pci.h
> > @@ -227,6 +227,8 @@ enum pci_dev_flags {
> > PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
> > /* Don't use Relaxed Ordering for TLPs directed at this device */
> > PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t)
> (1 <<
> > 11),
> > +/* AMD simple suspend opt quirk */
> > +PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force
> pci_dev_flags_t) (1
> > +<< 12),
> > };
> >
> > enum pci_irq_reroute_variant {
> > diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index
> > d8156a5..7f6340c 100644
> > --- a/include/linux/pci_ids.h
> > +++ b/include/linux/pci_ids.h
> > @@ -602,6 +602,8 @@
> > #define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS0x780b
> > #define PCI_DEVICE_ID_AMD_HUDSON2_IDE0x780c
> > #define PCI_DEVICE_ID_AMD_KERNCZ_SMBUS 0x790b
> > +#define PCI_DEVICE_ID_AMD_CZN_RP0x1630
> > +#define PCI_DEVICE_ID_AMD_RN_RP
> PCI_DEVICE_ID_AMD_CZN_RP
>
> If the pci ids are identical, why do you need different entries for it?
> Haven't you above just listed the same thing twice in the quirk entry?
>
> thanks,
>
> greg k-h
[Prike] Use the different entries for identifying the RN/CZN respectively and that will clearly imply which ASIC need this quirk. Anyway we can use the one DID for RN/CZN to avoid the PCI ID retrieved twice.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
2021-04-13 6:44 ` Liang, Prike
@ 2021-04-13 7:00 ` Greg KH
2021-04-13 8:16 ` Liang, Prike
0 siblings, 1 reply; 12+ messages in thread
From: Greg KH @ 2021-04-13 7:00 UTC (permalink / raw)
To: Liang, Prike
Cc: Chaitanya Kulkarni, stable@vger.kernel.org, Deucher, Alexander,
S-k, Shyam-sundar
On Tue, Apr 13, 2021 at 06:44:08AM +0000, Liang, Prike wrote:
> [AMD Public Use]
>
> >
> > On Tue, Apr 13, 2021 at 02:10:21PM +0800, Prike Liang wrote:
> > > The NVME device pluged in some AMD PCIE root port will resume timeout
> > > from s2idle which caused by NVME power CFG lost in the SMU FW restore.
> > > This issue can be workaround by using PCIe power set with simple
> > > suspend/resume process path instead of APST. In the onwards ASIC will
> > > try do the NVME shutdown save and restore in the BIOS and still need
> > > PCIe power setting to resume from RTD3 for s2idle.
> > >
> > > Signed-off-by: Prike Liang <Prike.Liang@amd.com>
> > > Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> > > Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> > > Cc: <stable@vger.kernel.org> # 5.11+
> > > ---
> > > drivers/nvme/host/pci.c | 5 +++++
> > > drivers/pci/quirks.c | 11 +++++++++++
> > > include/linux/pci.h | 2 ++
> > > include/linux/pci_ids.h | 2 ++
> > > 4 files changed, 20 insertions(+)
> > >
> > > diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index
> > > 6bad4d4..dd46d9e 100644
> > > --- a/drivers/nvme/host/pci.c
> > > +++ b/drivers/nvme/host/pci.c
> > > @@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct pci_dev
> > > *dev) {
> > > struct acpi_device *adev;
> > > struct pci_dev *root;
> > > +struct pci_dev *rdev;
> > > acpi_handle handle;
> > > acpi_status status;
> > > u8 val;
> > > @@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct
> > pci_dev *dev)
> > > if (!root)
> > > return false;
> > >
> > > +rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
> > > +if (rdev->dev_flags &
> > PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
> > > +return NVME_QUIRK_SIMPLE_SUSPEND;
> > > +
> > > adev = ACPI_COMPANION(&root->dev);
> > > if (!adev)
> > > return false;
> > > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index
> > > 653660e3..b7e19bb 100644
> > > --- a/drivers/pci/quirks.c
> > > +++ b/drivers/pci/quirks.c
> > > @@ -312,6 +312,17 @@ static void quirk_nopciamd(struct pci_dev *dev)
> > > }
> > > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> > PCI_DEVICE_ID_AMD_8151_0,quirk_nopciamd);
> > >
> > > +static void quirk_amd_nvme_fixup(struct pci_dev *dev) {
> > > +struct pci_dev *rdev;
> > > +
> > > +dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
> > > +pci_info(dev, "AMD simple suspend opt enabled\n");
> > > +
> > > +}
> > > +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> > PCI_DEVICE_ID_AMD_CZN_RP,
> > > +quirk_amd_nvme_fixup);
> > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> > > +PCI_DEVICE_ID_AMD_RN_RP, quirk_amd_nvme_fixup);
> > > +
> > > /* Triton requires workarounds to be used by the drivers */ static
> > > void quirk_triton(struct pci_dev *dev) { diff --git
> > > a/include/linux/pci.h b/include/linux/pci.h index 53f4904..a6e1b1b
> > > 100644
> > > --- a/include/linux/pci.h
> > > +++ b/include/linux/pci.h
> > > @@ -227,6 +227,8 @@ enum pci_dev_flags {
> > > PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
> > > /* Don't use Relaxed Ordering for TLPs directed at this device */
> > > PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t)
> > (1 <<
> > > 11),
> > > +/* AMD simple suspend opt quirk */
> > > +PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force
> > pci_dev_flags_t) (1
> > > +<< 12),
> > > };
> > >
> > > enum pci_irq_reroute_variant {
> > > diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index
> > > d8156a5..7f6340c 100644
> > > --- a/include/linux/pci_ids.h
> > > +++ b/include/linux/pci_ids.h
> > > @@ -602,6 +602,8 @@
> > > #define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS0x780b
> > > #define PCI_DEVICE_ID_AMD_HUDSON2_IDE0x780c
> > > #define PCI_DEVICE_ID_AMD_KERNCZ_SMBUS 0x790b
> > > +#define PCI_DEVICE_ID_AMD_CZN_RP0x1630
> > > +#define PCI_DEVICE_ID_AMD_RN_RP
> > PCI_DEVICE_ID_AMD_CZN_RP
> >
> > If the pci ids are identical, why do you need different entries for it?
> > Haven't you above just listed the same thing twice in the quirk entry?
> >
> > thanks,
> >
> > greg k-h
> [Prike] Use the different entries for identifying the RN/CZN respectively and that will clearly imply which ASIC need this quirk. Anyway we can use the one DID for RN/CZN to avoid the PCI ID retrieved twice.
But look at this patch, you list the same device ids in a quirk entry
twice, why???
PCI device ids should be unique per-device, and not shared with
different names like this. Also, why even add them to the .h file, you
did read the top of it, right?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 12+ messages in thread
* RE: [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
2021-04-13 7:00 ` Greg KH
@ 2021-04-13 8:16 ` Liang, Prike
0 siblings, 0 replies; 12+ messages in thread
From: Liang, Prike @ 2021-04-13 8:16 UTC (permalink / raw)
To: Greg KH
Cc: Chaitanya Kulkarni, stable@vger.kernel.org, Deucher, Alexander,
S-k, Shyam-sundar
[AMD Public Use]
> From: Greg KH <gregkh@linuxfoundation.org>
> Sent: Tuesday, April 13, 2021 3:01 PM
> To: Liang, Prike <Prike.Liang@amd.com>
> Cc: Chaitanya Kulkarni <Chaitanya.Kulkarni@wdc.com>;
> stable@vger.kernel.org; Deucher, Alexander
> <Alexander.Deucher@amd.com>; S-k, Shyam-sundar <Shyam-sundar.S-
> k@amd.com>
> Subject: Re: [PATCH] nvme: put some AMD PCIE downstream NVME device to
> simple suspend/resume path
>
> On Tue, Apr 13, 2021 at 06:44:08AM +0000, Liang, Prike wrote:
> > [AMD Public Use]
> >
> > >
> > > On Tue, Apr 13, 2021 at 02:10:21PM +0800, Prike Liang wrote:
> > > > The NVME device pluged in some AMD PCIE root port will resume
> > > > timeout from s2idle which caused by NVME power CFG lost in the SMU
> FW restore.
> > > > This issue can be workaround by using PCIe power set with simple
> > > > suspend/resume process path instead of APST. In the onwards ASIC
> > > > will try do the NVME shutdown save and restore in the BIOS and
> > > > still need PCIe power setting to resume from RTD3 for s2idle.
> > > >
> > > > Signed-off-by: Prike Liang <Prike.Liang@amd.com>
> > > > Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> > > > Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> > > > Cc: <stable@vger.kernel.org> # 5.11+
> > > > ---
> > > > drivers/nvme/host/pci.c | 5 +++++
> > > > drivers/pci/quirks.c | 11 +++++++++++
> > > > include/linux/pci.h | 2 ++
> > > > include/linux/pci_ids.h | 2 ++
> > > > 4 files changed, 20 insertions(+)
> > > >
> > > > diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
> > > > index 6bad4d4..dd46d9e 100644
> > > > --- a/drivers/nvme/host/pci.c
> > > > +++ b/drivers/nvme/host/pci.c
> > > > @@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct
> > > > pci_dev
> > > > *dev) {
> > > > struct acpi_device *adev;
> > > > struct pci_dev *root;
> > > > +struct pci_dev *rdev;
> > > > acpi_handle handle;
> > > > acpi_status status;
> > > > u8 val;
> > > > @@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct
> > > pci_dev *dev)
> > > > if (!root)
> > > > return false;
> > > >
> > > > +rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0)); if
> > > > +(rdev->dev_flags &
> > > PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
> > > > +return NVME_QUIRK_SIMPLE_SUSPEND;
> > > > +
> > > > adev = ACPI_COMPANION(&root->dev); if (!adev) return false;
> > > > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index
> > > > 653660e3..b7e19bb 100644
> > > > --- a/drivers/pci/quirks.c
> > > > +++ b/drivers/pci/quirks.c
> > > > @@ -312,6 +312,17 @@ static void quirk_nopciamd(struct pci_dev
> > > > *dev) } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> > > PCI_DEVICE_ID_AMD_8151_0,quirk_nopciamd);
> > > >
> > > > +static void quirk_amd_nvme_fixup(struct pci_dev *dev) { struct
> > > > +pci_dev *rdev;
> > > > +
> > > > +dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
> > > > +pci_info(dev, "AMD simple suspend opt enabled\n");
> > > > +
> > > > +}
> > > > +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> > > PCI_DEVICE_ID_AMD_CZN_RP,
> > > > +quirk_amd_nvme_fixup);
> > > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> > > > +PCI_DEVICE_ID_AMD_RN_RP, quirk_amd_nvme_fixup);
> > > > +
> > > > /* Triton requires workarounds to be used by the drivers */
> > > > static void quirk_triton(struct pci_dev *dev) { diff --git
> > > > a/include/linux/pci.h b/include/linux/pci.h index 53f4904..a6e1b1b
> > > > 100644
> > > > --- a/include/linux/pci.h
> > > > +++ b/include/linux/pci.h
> > > > @@ -227,6 +227,8 @@ enum pci_dev_flags {
> > > > PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
> > > > /* Don't use Relaxed Ordering for TLPs directed at this device */
> > > > PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t)
> > > (1 <<
> > > > 11),
> > > > +/* AMD simple suspend opt quirk */
> > > > +PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force
> > > pci_dev_flags_t) (1
> > > > +<< 12),
> > > > };
> > > >
> > > > enum pci_irq_reroute_variant {
> > > > diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> > > > index d8156a5..7f6340c 100644
> > > > --- a/include/linux/pci_ids.h
> > > > +++ b/include/linux/pci_ids.h
> > > > @@ -602,6 +602,8 @@
> > > > #define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS0x780b
> > > > #define PCI_DEVICE_ID_AMD_HUDSON2_IDE0x780c
> > > > #define PCI_DEVICE_ID_AMD_KERNCZ_SMBUS 0x790b
> > > > +#define PCI_DEVICE_ID_AMD_CZN_RP0x1630 #define
> > > > +PCI_DEVICE_ID_AMD_RN_RP
> > > PCI_DEVICE_ID_AMD_CZN_RP
> > >
> > > If the pci ids are identical, why do you need different entries for it?
> > > Haven't you above just listed the same thing twice in the quirk entry?
> > >
> > > thanks,
> > >
> > > greg k-h
> > [Prike] Use the different entries for identifying the RN/CZN respectively and
> that will clearly imply which ASIC need this quirk. Anyway we can use the one
> DID for RN/CZN to avoid the PCI ID retrieved twice.
>
> But look at this patch, you list the same device ids in a quirk entry twice,
> why???
>
[Prike] The previous thought was that used the device ids name to clarifying which ASIC need this quirk.
But that will traverse device ids twice and will remove one of the entry check.
> PCI device ids should be unique per-device, and not shared with different
> names like this. Also, why even add them to the .h file, you did read the top
> of it, right?
[Prike] Thanks point out it and will remove the RN DID definition.
>
> thanks,
>
> greg k-h
[Prike]
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
@ 2021-04-13 9:00 Prike Liang
2021-04-13 9:12 ` Greg KH
0 siblings, 1 reply; 12+ messages in thread
From: Prike Liang @ 2021-04-13 9:00 UTC (permalink / raw)
To: linux-nvme, kbusch, gregkh, Chaitanya.Kulkarni
Cc: stable, Shyam-sundar.S-k, Alexander.Deucher, Prike Liang
The NVME device pluged in some AMD PCIE root port will resume timeout
from s2idle which caused by NVME power CFG lost in the SMU FW restore.
This issue can be workaround by using PCIe power set with simple
suspend/resume process path instead of APST. In the onwards ASIC will
try do the NVME shutdown save and restore in the BIOS and still need PCIe
power setting to resume from RTD3 for s2idle.
Signed-off-by: Prike Liang <Prike.Liang@amd.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Cc: <stable@vger.kernel.org> # 5.11+
---
drivers/nvme/host/pci.c | 5 +++++
drivers/pci/quirks.c | 10 ++++++++++
include/linux/pci.h | 2 ++
include/linux/pci_ids.h | 1 +
4 files changed, 18 insertions(+)
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 6bad4d4..dd46d9e 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
{
struct acpi_device *adev;
struct pci_dev *root;
+ struct pci_dev *rdev;
acpi_handle handle;
acpi_status status;
u8 val;
@@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
if (!root)
return false;
+ rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
+ if (rdev->dev_flags & PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
+ return NVME_QUIRK_SIMPLE_SUSPEND;
+
adev = ACPI_COMPANION(&root->dev);
if (!adev)
return false;
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 653660e3..0b175ce 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -312,6 +312,16 @@ static void quirk_nopciamd(struct pci_dev *dev)
}
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8151_0, quirk_nopciamd);
+static void quirk_amd_nvme_fixup(struct pci_dev *dev)
+{
+ struct pci_dev *rdev;
+
+ dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
+ pci_info(dev, "AMD simple suspend opt enabled\n");
+
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CZN_RP, quirk_amd_nvme_fixup);
+
/* Triton requires workarounds to be used by the drivers */
static void quirk_triton(struct pci_dev *dev)
{
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 53f4904..a6e1b1b 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -227,6 +227,8 @@ enum pci_dev_flags {
PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
/* Don't use Relaxed Ordering for TLPs directed at this device */
PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11),
+ /* AMD simple suspend opt quirk */
+ PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force pci_dev_flags_t) (1 << 12),
};
enum pci_irq_reroute_variant {
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index d8156a5..a82443f 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -602,6 +602,7 @@
#define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS 0x780b
#define PCI_DEVICE_ID_AMD_HUDSON2_IDE 0x780c
#define PCI_DEVICE_ID_AMD_KERNCZ_SMBUS 0x790b
+#define PCI_DEVICE_ID_AMD_CZN_RP 0x1630
#define PCI_VENDOR_ID_TRIDENT 0x1023
#define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX 0x2000
--
2.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
2021-04-13 9:00 [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path Prike Liang
@ 2021-04-13 9:12 ` Greg KH
2021-04-13 9:30 ` Liang, Prike
0 siblings, 1 reply; 12+ messages in thread
From: Greg KH @ 2021-04-13 9:12 UTC (permalink / raw)
To: Prike Liang
Cc: linux-nvme, kbusch, Chaitanya.Kulkarni, stable, Shyam-sundar.S-k,
Alexander.Deucher
On Tue, Apr 13, 2021 at 05:00:41PM +0800, Prike Liang wrote:
> The NVME device pluged in some AMD PCIE root port will resume timeout
> from s2idle which caused by NVME power CFG lost in the SMU FW restore.
> This issue can be workaround by using PCIe power set with simple
> suspend/resume process path instead of APST. In the onwards ASIC will
> try do the NVME shutdown save and restore in the BIOS and still need PCIe
> power setting to resume from RTD3 for s2idle.
>
> Signed-off-by: Prike Liang <Prike.Liang@amd.com>
> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> Cc: <stable@vger.kernel.org> # 5.11+
> ---
> drivers/nvme/host/pci.c | 5 +++++
> drivers/pci/quirks.c | 10 ++++++++++
> include/linux/pci.h | 2 ++
> include/linux/pci_ids.h | 1 +
> 4 files changed, 18 insertions(+)
>
> diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
> index 6bad4d4..dd46d9e 100644
> --- a/drivers/nvme/host/pci.c
> +++ b/drivers/nvme/host/pci.c
> @@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
> {
> struct acpi_device *adev;
> struct pci_dev *root;
> + struct pci_dev *rdev;
> acpi_handle handle;
> acpi_status status;
> u8 val;
> @@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
> if (!root)
> return false;
>
> + rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
> + if (rdev->dev_flags & PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
> + return NVME_QUIRK_SIMPLE_SUSPEND;
> +
> adev = ACPI_COMPANION(&root->dev);
> if (!adev)
> return false;
> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> index 653660e3..0b175ce 100644
> --- a/drivers/pci/quirks.c
> +++ b/drivers/pci/quirks.c
> @@ -312,6 +312,16 @@ static void quirk_nopciamd(struct pci_dev *dev)
> }
> DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8151_0, quirk_nopciamd);
>
> +static void quirk_amd_nvme_fixup(struct pci_dev *dev)
> +{
> + struct pci_dev *rdev;
> +
> + dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
> + pci_info(dev, "AMD simple suspend opt enabled\n");
> +
> +}
> +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CZN_RP, quirk_amd_nvme_fixup);
> +
> /* Triton requires workarounds to be used by the drivers */
> static void quirk_triton(struct pci_dev *dev)
> {
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 53f4904..a6e1b1b 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -227,6 +227,8 @@ enum pci_dev_flags {
> PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
> /* Don't use Relaxed Ordering for TLPs directed at this device */
> PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11),
> + /* AMD simple suspend opt quirk */
> + PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force pci_dev_flags_t) (1 << 12),
> };
>
> enum pci_irq_reroute_variant {
> diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> index d8156a5..a82443f 100644
> --- a/include/linux/pci_ids.h
> +++ b/include/linux/pci_ids.h
> @@ -602,6 +602,7 @@
> #define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS 0x780b
> #define PCI_DEVICE_ID_AMD_HUDSON2_IDE 0x780c
> #define PCI_DEVICE_ID_AMD_KERNCZ_SMBUS 0x790b
> +#define PCI_DEVICE_ID_AMD_CZN_RP 0x1630
Why add this here when it is not needed in this file? Please read the
top of the file...
thanks,
greg k-h
^ permalink raw reply [flat|nested] 12+ messages in thread
* RE: [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
2021-04-13 9:12 ` Greg KH
@ 2021-04-13 9:30 ` Liang, Prike
2021-04-13 9:40 ` Greg KH
0 siblings, 1 reply; 12+ messages in thread
From: Liang, Prike @ 2021-04-13 9:30 UTC (permalink / raw)
To: Greg KH
Cc: linux-nvme@lists.infradead.org, kbusch@kernel.org,
Chaitanya.Kulkarni@wdc.com, stable@vger.kernel.org,
S-k, Shyam-sundar, Deucher, Alexander
[AMD Public Use]
> From: Greg KH <gregkh@linuxfoundation.org>
> Sent: Tuesday, April 13, 2021 5:12 PM
> To: Liang, Prike <Prike.Liang@amd.com>
> Cc: linux-nvme@lists.infradead.org; kbusch@kernel.org;
> Chaitanya.Kulkarni@wdc.com; stable@vger.kernel.org; S-k, Shyam-sundar
> <Shyam-sundar.S-k@amd.com>; Deucher, Alexander
> <Alexander.Deucher@amd.com>
> Subject: Re: [PATCH] nvme: put some AMD PCIE downstream NVME device to
> simple suspend/resume path
>
> On Tue, Apr 13, 2021 at 05:00:41PM +0800, Prike Liang wrote:
> > The NVME device pluged in some AMD PCIE root port will resume timeout
> > from s2idle which caused by NVME power CFG lost in the SMU FW restore.
> > This issue can be workaround by using PCIe power set with simple
> > suspend/resume process path instead of APST. In the onwards ASIC will
> > try do the NVME shutdown save and restore in the BIOS and still need
> > PCIe power setting to resume from RTD3 for s2idle.
> >
> > Signed-off-by: Prike Liang <Prike.Liang@amd.com>
> > Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> > Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> > Cc: <stable@vger.kernel.org> # 5.11+
> > ---
> > drivers/nvme/host/pci.c | 5 +++++
> > drivers/pci/quirks.c | 10 ++++++++++
> > include/linux/pci.h | 2 ++
> > include/linux/pci_ids.h | 1 +
> > 4 files changed, 18 insertions(+)
> >
> > diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index
> > 6bad4d4..dd46d9e 100644
> > --- a/drivers/nvme/host/pci.c
> > +++ b/drivers/nvme/host/pci.c
> > @@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct pci_dev
> > *dev) {
> > struct acpi_device *adev;
> > struct pci_dev *root;
> > +struct pci_dev *rdev;
> > acpi_handle handle;
> > acpi_status status;
> > u8 val;
> > @@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct
> pci_dev *dev)
> > if (!root)
> > return false;
> >
> > +rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
> > +if (rdev->dev_flags &
> PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
> > +return NVME_QUIRK_SIMPLE_SUSPEND;
> > +
> > adev = ACPI_COMPANION(&root->dev);
> > if (!adev)
> > return false;
> > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index
> > 653660e3..0b175ce 100644
> > --- a/drivers/pci/quirks.c
> > +++ b/drivers/pci/quirks.c
> > @@ -312,6 +312,16 @@ static void quirk_nopciamd(struct pci_dev *dev)
> > }
> > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> PCI_DEVICE_ID_AMD_8151_0,quirk_nopciamd);
> >
> > +static void quirk_amd_nvme_fixup(struct pci_dev *dev) {
> > +struct pci_dev *rdev;
> > +
> > +dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
> > +pci_info(dev, "AMD simple suspend opt enabled\n");
> > +
> > +}
> > +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> PCI_DEVICE_ID_AMD_CZN_RP,
> > +quirk_amd_nvme_fixup);
> > +
> > /* Triton requires workarounds to be used by the drivers */ static
> > void quirk_triton(struct pci_dev *dev) { diff --git
> > a/include/linux/pci.h b/include/linux/pci.h index 53f4904..a6e1b1b
> > 100644
> > --- a/include/linux/pci.h
> > +++ b/include/linux/pci.h
> > @@ -227,6 +227,8 @@ enum pci_dev_flags {
> > PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
> > /* Don't use Relaxed Ordering for TLPs directed at this device */
> > PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t)
> (1 <<
> > 11),
> > +/* AMD simple suspend opt quirk */
> > +PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force
> pci_dev_flags_t) (1
> > +<< 12),
> > };
> >
> > enum pci_irq_reroute_variant {
> > diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index
> > d8156a5..a82443f 100644
> > --- a/include/linux/pci_ids.h
> > +++ b/include/linux/pci_ids.h
> > @@ -602,6 +602,7 @@
> > #define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS0x780b
> > #define PCI_DEVICE_ID_AMD_HUDSON2_IDE0x780c
> > #define PCI_DEVICE_ID_AMD_KERNCZ_SMBUS 0x790b
> > +#define PCI_DEVICE_ID_AMD_CZN_RP0x1630
>
> Why add this here when it is not needed in this file? Please read the top of
> the file...
>
[Prike] I'm sorry can't get you meaning before. Do you mean the pci_id header used only for the global PCI ID definition and in this case only need put the 0x1630 DID in the quirk entry directly?
> thanks,
>
> greg k-h
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
2021-04-13 9:30 ` Liang, Prike
@ 2021-04-13 9:40 ` Greg KH
0 siblings, 0 replies; 12+ messages in thread
From: Greg KH @ 2021-04-13 9:40 UTC (permalink / raw)
To: Liang, Prike
Cc: linux-nvme@lists.infradead.org, kbusch@kernel.org,
Chaitanya.Kulkarni@wdc.com, stable@vger.kernel.org,
S-k, Shyam-sundar, Deucher, Alexander
On Tue, Apr 13, 2021 at 09:30:13AM +0000, Liang, Prike wrote:
> [AMD Public Use]
>
> > From: Greg KH <gregkh@linuxfoundation.org>
> > Sent: Tuesday, April 13, 2021 5:12 PM
> > To: Liang, Prike <Prike.Liang@amd.com>
> > Cc: linux-nvme@lists.infradead.org; kbusch@kernel.org;
> > Chaitanya.Kulkarni@wdc.com; stable@vger.kernel.org; S-k, Shyam-sundar
> > <Shyam-sundar.S-k@amd.com>; Deucher, Alexander
> > <Alexander.Deucher@amd.com>
> > Subject: Re: [PATCH] nvme: put some AMD PCIE downstream NVME device to
> > simple suspend/resume path
> >
> > On Tue, Apr 13, 2021 at 05:00:41PM +0800, Prike Liang wrote:
> > > The NVME device pluged in some AMD PCIE root port will resume timeout
> > > from s2idle which caused by NVME power CFG lost in the SMU FW restore.
> > > This issue can be workaround by using PCIe power set with simple
> > > suspend/resume process path instead of APST. In the onwards ASIC will
> > > try do the NVME shutdown save and restore in the BIOS and still need
> > > PCIe power setting to resume from RTD3 for s2idle.
> > >
> > > Signed-off-by: Prike Liang <Prike.Liang@amd.com>
> > > Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> > > Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> > > Cc: <stable@vger.kernel.org> # 5.11+
> > > ---
> > > drivers/nvme/host/pci.c | 5 +++++
> > > drivers/pci/quirks.c | 10 ++++++++++
> > > include/linux/pci.h | 2 ++
> > > include/linux/pci_ids.h | 1 +
> > > 4 files changed, 18 insertions(+)
> > >
> > > diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index
> > > 6bad4d4..dd46d9e 100644
> > > --- a/drivers/nvme/host/pci.c
> > > +++ b/drivers/nvme/host/pci.c
> > > @@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct pci_dev
> > > *dev) {
> > > struct acpi_device *adev;
> > > struct pci_dev *root;
> > > +struct pci_dev *rdev;
> > > acpi_handle handle;
> > > acpi_status status;
> > > u8 val;
> > > @@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct
> > pci_dev *dev)
> > > if (!root)
> > > return false;
> > >
> > > +rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
> > > +if (rdev->dev_flags &
> > PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
> > > +return NVME_QUIRK_SIMPLE_SUSPEND;
> > > +
> > > adev = ACPI_COMPANION(&root->dev);
> > > if (!adev)
> > > return false;
> > > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index
> > > 653660e3..0b175ce 100644
> > > --- a/drivers/pci/quirks.c
> > > +++ b/drivers/pci/quirks.c
> > > @@ -312,6 +312,16 @@ static void quirk_nopciamd(struct pci_dev *dev)
> > > }
> > > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> > PCI_DEVICE_ID_AMD_8151_0,quirk_nopciamd);
> > >
> > > +static void quirk_amd_nvme_fixup(struct pci_dev *dev) {
> > > +struct pci_dev *rdev;
> > > +
> > > +dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
> > > +pci_info(dev, "AMD simple suspend opt enabled\n");
> > > +
> > > +}
> > > +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,
> > PCI_DEVICE_ID_AMD_CZN_RP,
> > > +quirk_amd_nvme_fixup);
> > > +
> > > /* Triton requires workarounds to be used by the drivers */ static
> > > void quirk_triton(struct pci_dev *dev) { diff --git
> > > a/include/linux/pci.h b/include/linux/pci.h index 53f4904..a6e1b1b
> > > 100644
> > > --- a/include/linux/pci.h
> > > +++ b/include/linux/pci.h
> > > @@ -227,6 +227,8 @@ enum pci_dev_flags {
> > > PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
> > > /* Don't use Relaxed Ordering for TLPs directed at this device */
> > > PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t)
> > (1 <<
> > > 11),
> > > +/* AMD simple suspend opt quirk */
> > > +PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force
> > pci_dev_flags_t) (1
> > > +<< 12),
> > > };
> > >
> > > enum pci_irq_reroute_variant {
> > > diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index
> > > d8156a5..a82443f 100644
> > > --- a/include/linux/pci_ids.h
> > > +++ b/include/linux/pci_ids.h
> > > @@ -602,6 +602,7 @@
> > > #define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS0x780b
> > > #define PCI_DEVICE_ID_AMD_HUDSON2_IDE0x780c
> > > #define PCI_DEVICE_ID_AMD_KERNCZ_SMBUS 0x790b
> > > +#define PCI_DEVICE_ID_AMD_CZN_RP0x1630
> >
> > Why add this here when it is not needed in this file? Please read the top of
> > the file...
> >
> [Prike] I'm sorry can't get you meaning before. Do you mean the pci_id header used only for the global PCI ID definition and in this case only need put the 0x1630 DID in the quirk entry directly?
Yes, it is not needed to be added to the pci_ids.h file unless it is
used in multiple .c files, which is not the case here.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
@ 2021-04-13 10:04 Prike Liang
2021-04-13 10:11 ` Greg KH
2021-04-13 15:56 ` Christoph Hellwig
0 siblings, 2 replies; 12+ messages in thread
From: Prike Liang @ 2021-04-13 10:04 UTC (permalink / raw)
To: linux-nvme, kbusch, Chaitanya.Kulkarni, gregkh
Cc: stable, Shyam-sundar.S-k, Alexander.Deucher, Prike Liang
The NVME device pluged in some AMD PCIE root port will resume timeout
from s2idle which caused by NVME power CFG lost in the SMU FW restore.
This issue can be workaround by using PCIe power set with simple
suspend/resume process path instead of APST. In the onwards ASIC will
try do the NVME shutdown save and restore in the BIOS and still need PCIe
power setting to resume from RTD3 for s2idle.
Signed-off-by: Prike Liang <Prike.Liang@amd.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Cc: <stable@vger.kernel.org> # 5.11+
---
drivers/nvme/host/pci.c | 5 +++++
drivers/pci/quirks.c | 10 ++++++++++
include/linux/pci.h | 2 ++
3 files changed, 17 insertions(+)
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 6bad4d4..dd46d9e 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -2832,6 +2832,7 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
{
struct acpi_device *adev;
struct pci_dev *root;
+ struct pci_dev *rdev;
acpi_handle handle;
acpi_status status;
u8 val;
@@ -2845,6 +2846,10 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
if (!root)
return false;
+ rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
+ if (rdev->dev_flags & PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND)
+ return NVME_QUIRK_SIMPLE_SUSPEND;
+
adev = ACPI_COMPANION(&root->dev);
if (!adev)
return false;
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 653660e3..f95c8b2 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -312,6 +312,16 @@ static void quirk_nopciamd(struct pci_dev *dev)
}
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8151_0, quirk_nopciamd);
+static void quirk_amd_nvme_fixup(struct pci_dev *dev)
+{
+ struct pci_dev *rdev;
+
+ dev->dev_flags |= PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND;
+ pci_info(dev, "AMD simple suspend opt enabled\n");
+
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x1630, quirk_amd_nvme_fixup);
+
/* Triton requires workarounds to be used by the drivers */
static void quirk_triton(struct pci_dev *dev)
{
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 53f4904..a6e1b1b 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -227,6 +227,8 @@ enum pci_dev_flags {
PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
/* Don't use Relaxed Ordering for TLPs directed at this device */
PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11),
+ /* AMD simple suspend opt quirk */
+ PCI_DEV_FLAGS_AMD_NVME_SIMPLE_SUSPEND = (__force pci_dev_flags_t) (1 << 12),
};
enum pci_irq_reroute_variant {
--
2.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
2021-04-13 10:04 Prike Liang
@ 2021-04-13 10:11 ` Greg KH
2021-04-13 15:56 ` Christoph Hellwig
1 sibling, 0 replies; 12+ messages in thread
From: Greg KH @ 2021-04-13 10:11 UTC (permalink / raw)
To: Prike Liang
Cc: linux-nvme, kbusch, Chaitanya.Kulkarni, stable, Shyam-sundar.S-k,
Alexander.Deucher
On Tue, Apr 13, 2021 at 06:04:49PM +0800, Prike Liang wrote:
> The NVME device pluged in some AMD PCIE root port will resume timeout
> from s2idle which caused by NVME power CFG lost in the SMU FW restore.
> This issue can be workaround by using PCIe power set with simple
> suspend/resume process path instead of APST. In the onwards ASIC will
> try do the NVME shutdown save and restore in the BIOS and still need PCIe
> power setting to resume from RTD3 for s2idle.
>
> Signed-off-by: Prike Liang <Prike.Liang@amd.com>
> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> Cc: <stable@vger.kernel.org> # 5.11+
> ---
> drivers/nvme/host/pci.c | 5 +++++
> drivers/pci/quirks.c | 10 ++++++++++
> include/linux/pci.h | 2 ++
> 3 files changed, 17 insertions(+)
Hi,
This is the friendly patch-bot of Greg Kroah-Hartman. You have sent him
a patch that has triggered this response. He used to manually respond
to these common problems, but in order to save his sanity (he kept
writing the same thing over and over, yet to different people), I was
created. Hopefully you will not take offence and will fix the problem
in your patch and resubmit it so that it can be accepted into the Linux
kernel tree.
You are receiving this message because of the following common error(s)
as indicated below:
- This looks like a new version of a previously submitted patch, but you
did not list below the --- line any changes from the previous version.
Please read the section entitled "The canonical patch format" in the
kernel file, Documentation/SubmittingPatches for what needs to be done
here to properly describe this.
If you wish to discuss this problem further, or you have questions about
how to resolve this issue, please feel free to respond to this email and
Greg will reply once he has dug out from the pending patches received
from other developers.
thanks,
greg k-h's patch email bot
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path
2021-04-13 10:04 Prike Liang
2021-04-13 10:11 ` Greg KH
@ 2021-04-13 15:56 ` Christoph Hellwig
1 sibling, 0 replies; 12+ messages in thread
From: Christoph Hellwig @ 2021-04-13 15:56 UTC (permalink / raw)
To: Prike Liang
Cc: linux-nvme, kbusch, Chaitanya.Kulkarni, gregkh, stable,
Shyam-sundar.S-k, Alexander.Deucher
This is still not split into separate patches for the PCI and nvme
parts.
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2021-04-13 15:57 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-04-13 9:00 [PATCH] nvme: put some AMD PCIE downstream NVME device to simple suspend/resume path Prike Liang
2021-04-13 9:12 ` Greg KH
2021-04-13 9:30 ` Liang, Prike
2021-04-13 9:40 ` Greg KH
-- strict thread matches above, loose matches on Subject: below --
2021-04-13 10:04 Prike Liang
2021-04-13 10:11 ` Greg KH
2021-04-13 15:56 ` Christoph Hellwig
2021-04-13 6:10 Prike Liang
2021-04-13 6:33 ` Greg KH
2021-04-13 6:44 ` Liang, Prike
2021-04-13 7:00 ` Greg KH
2021-04-13 8:16 ` Liang, Prike
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).