Re: [Nouveau] [PATCH 1/3] pci: force disable ASPM before changing the link speed

2019-09-17 Thread Karol Herbst
On Tue, Sep 17, 2019 at 7:56 AM Ben Skeggs  wrote:
>
> On Fri, 13 Sep 2019 at 05:00, Karol Herbst  wrote:
> >
> > taken from nvgpu
> >
> > Signed-off-by: Karol Herbst 
> > ---
> >  drm/nouveau/nvkm/subdev/pci/g84.c   |  9 +
> >  drm/nouveau/nvkm/subdev/pci/g92.c   |  1 +
> >  drm/nouveau/nvkm/subdev/pci/g94.c   |  1 +
> >  drm/nouveau/nvkm/subdev/pci/gf100.c |  1 +
> >  drm/nouveau/nvkm/subdev/pci/gf106.c |  1 +
> >  drm/nouveau/nvkm/subdev/pci/gk104.c |  1 +
> >  drm/nouveau/nvkm/subdev/pci/pcie.c  | 14 ++
> >  drm/nouveau/nvkm/subdev/pci/priv.h  |  2 ++
> >  8 files changed, 30 insertions(+)
> >
> > diff --git a/drm/nouveau/nvkm/subdev/pci/g84.c 
> > b/drm/nouveau/nvkm/subdev/pci/g84.c
> > index 62438d892..353d70d7e 100644
> > --- a/drm/nouveau/nvkm/subdev/pci/g84.c
> > +++ b/drm/nouveau/nvkm/subdev/pci/g84.c
> > @@ -122,6 +122,14 @@ g84_pci_init(struct nvkm_pci *pci)
> > nvkm_pci_mask(pci, 0x041c, 0x0060, 0x);
> >  }
> >
> > +void
> > +g84_pcie_force_aspm_off(struct nvkm_pci *pci, bool status)
> > +{
> > +   /* L0s and L1 */
> > +   u32 value = status ? 0x180 : 0x0;
> > +   nvkm_pci_mask(pci, 0x150, 0x180, value);
> > +}
> > +
> >  int
> >  g84_pcie_init(struct nvkm_pci *pci)
> >  {
> > @@ -147,6 +155,7 @@ g84_pci_func = {
> > .pcie.set_version = g84_pcie_set_version,
> > .pcie.version = g84_pcie_version,
> > .pcie.version_supported = g84_pcie_version_supported,
> > +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
> >  };
> >
> >  int
> > diff --git a/drm/nouveau/nvkm/subdev/pci/g92.c 
> > b/drm/nouveau/nvkm/subdev/pci/g92.c
> > index 48874359d..8c35cc89e 100644
> > --- a/drm/nouveau/nvkm/subdev/pci/g92.c
> > +++ b/drm/nouveau/nvkm/subdev/pci/g92.c
> > @@ -48,6 +48,7 @@ g92_pci_func = {
> > .pcie.set_version = g84_pcie_set_version,
> > .pcie.version = g84_pcie_version,
> > .pcie.version_supported = g92_pcie_version_supported,
> > +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
> >  };
> >
> >  int
> > diff --git a/drm/nouveau/nvkm/subdev/pci/g94.c 
> > b/drm/nouveau/nvkm/subdev/pci/g94.c
> > index 09adb37a5..aa152d798 100644
> > --- a/drm/nouveau/nvkm/subdev/pci/g94.c
> > +++ b/drm/nouveau/nvkm/subdev/pci/g94.c
> > @@ -40,6 +40,7 @@ g94_pci_func = {
> > .pcie.set_version = g84_pcie_set_version,
> > .pcie.version = g84_pcie_version,
> > .pcie.version_supported = g92_pcie_version_supported,
> > +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
> >  };
> >
> >  int
> > diff --git a/drm/nouveau/nvkm/subdev/pci/gf100.c 
> > b/drm/nouveau/nvkm/subdev/pci/gf100.c
> > index 00a5e7d3e..8676480c3 100644
> > --- a/drm/nouveau/nvkm/subdev/pci/gf100.c
> > +++ b/drm/nouveau/nvkm/subdev/pci/gf100.c
> > @@ -93,6 +93,7 @@ gf100_pci_func = {
> > .pcie.set_version = gf100_pcie_set_version,
> > .pcie.version = gf100_pcie_version,
> > .pcie.version_supported = g92_pcie_version_supported,
> > +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
> >  };
> >
> >  int
> > diff --git a/drm/nouveau/nvkm/subdev/pci/gf106.c 
> > b/drm/nouveau/nvkm/subdev/pci/gf106.c
> > index 11bf419af..8079ebdd4 100644
> > --- a/drm/nouveau/nvkm/subdev/pci/gf106.c
> > +++ b/drm/nouveau/nvkm/subdev/pci/gf106.c
> > @@ -40,6 +40,7 @@ gf106_pci_func = {
> > .pcie.set_version = gf100_pcie_set_version,
> > .pcie.version = gf100_pcie_version,
> > .pcie.version_supported = g92_pcie_version_supported,
> > +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
> >  };
> >
> >  int
> > diff --git a/drm/nouveau/nvkm/subdev/pci/gk104.c 
> > b/drm/nouveau/nvkm/subdev/pci/gk104.c
> > index e68030507..b73922c52 100644
> > --- a/drm/nouveau/nvkm/subdev/pci/gk104.c
> > +++ b/drm/nouveau/nvkm/subdev/pci/gk104.c
> > @@ -219,6 +219,7 @@ gk104_pci_func = {
> > .pcie.set_version = gf100_pcie_set_version,
> > .pcie.version = gf100_pcie_version,
> > .pcie.version_supported = gk104_pcie_version_supported,
> > +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
> >  };
> >
> >  int
> > diff --git a/drm/nouveau/nvkm/subdev/pci/pcie.c 
> > b/drm/nouveau/nvkm/subdev/pci/pcie.c
> > index d71e5db50..354ac4c85 100644
> > --- a/drm/nouveau/nvkm/subdev/pci/pcie.c
> > +++ b/drm/nouveau/nvkm/subdev/pci/pcie.c
> > @@ -111,6 +111,14 @@ nvkm_pcie_init(struct nvkm_pci *pci)
> > return 0;
> >  }
> >
> > +void
> > +nvkm_pcie_force_aspm_off(struct nvkm_pci *pci, bool status)
> > +{
> > +   if (!pci->func->pcie.force_aspm_off)
> > +   return;
> > +   pci->func->pcie.force_aspm_off(pci, status);
> > +}
> > +
> >  int
> >  nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 
> > width)
> >  {
> > @@ -157,9 +165,15 @@ nvkm_pcie_set_link(struct nvkm_pci *pci, enum 
> > nvkm_pcie_speed speed, u8 width)
> > nvkm_debug(subdev, "set link to %s x%i\n",
> >nvkm_pcie_speeds[speed], width);
> >
> > 

Re: [Nouveau] [PATCH 1/3] pci: force disable ASPM before changing the link speed

2019-09-16 Thread Ben Skeggs
On Fri, 13 Sep 2019 at 05:00, Karol Herbst  wrote:
>
> taken from nvgpu
>
> Signed-off-by: Karol Herbst 
> ---
>  drm/nouveau/nvkm/subdev/pci/g84.c   |  9 +
>  drm/nouveau/nvkm/subdev/pci/g92.c   |  1 +
>  drm/nouveau/nvkm/subdev/pci/g94.c   |  1 +
>  drm/nouveau/nvkm/subdev/pci/gf100.c |  1 +
>  drm/nouveau/nvkm/subdev/pci/gf106.c |  1 +
>  drm/nouveau/nvkm/subdev/pci/gk104.c |  1 +
>  drm/nouveau/nvkm/subdev/pci/pcie.c  | 14 ++
>  drm/nouveau/nvkm/subdev/pci/priv.h  |  2 ++
>  8 files changed, 30 insertions(+)
>
> diff --git a/drm/nouveau/nvkm/subdev/pci/g84.c 
> b/drm/nouveau/nvkm/subdev/pci/g84.c
> index 62438d892..353d70d7e 100644
> --- a/drm/nouveau/nvkm/subdev/pci/g84.c
> +++ b/drm/nouveau/nvkm/subdev/pci/g84.c
> @@ -122,6 +122,14 @@ g84_pci_init(struct nvkm_pci *pci)
> nvkm_pci_mask(pci, 0x041c, 0x0060, 0x);
>  }
>
> +void
> +g84_pcie_force_aspm_off(struct nvkm_pci *pci, bool status)
> +{
> +   /* L0s and L1 */
> +   u32 value = status ? 0x180 : 0x0;
> +   nvkm_pci_mask(pci, 0x150, 0x180, value);
> +}
> +
>  int
>  g84_pcie_init(struct nvkm_pci *pci)
>  {
> @@ -147,6 +155,7 @@ g84_pci_func = {
> .pcie.set_version = g84_pcie_set_version,
> .pcie.version = g84_pcie_version,
> .pcie.version_supported = g84_pcie_version_supported,
> +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
>  };
>
>  int
> diff --git a/drm/nouveau/nvkm/subdev/pci/g92.c 
> b/drm/nouveau/nvkm/subdev/pci/g92.c
> index 48874359d..8c35cc89e 100644
> --- a/drm/nouveau/nvkm/subdev/pci/g92.c
> +++ b/drm/nouveau/nvkm/subdev/pci/g92.c
> @@ -48,6 +48,7 @@ g92_pci_func = {
> .pcie.set_version = g84_pcie_set_version,
> .pcie.version = g84_pcie_version,
> .pcie.version_supported = g92_pcie_version_supported,
> +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
>  };
>
>  int
> diff --git a/drm/nouveau/nvkm/subdev/pci/g94.c 
> b/drm/nouveau/nvkm/subdev/pci/g94.c
> index 09adb37a5..aa152d798 100644
> --- a/drm/nouveau/nvkm/subdev/pci/g94.c
> +++ b/drm/nouveau/nvkm/subdev/pci/g94.c
> @@ -40,6 +40,7 @@ g94_pci_func = {
> .pcie.set_version = g84_pcie_set_version,
> .pcie.version = g84_pcie_version,
> .pcie.version_supported = g92_pcie_version_supported,
> +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
>  };
>
>  int
> diff --git a/drm/nouveau/nvkm/subdev/pci/gf100.c 
> b/drm/nouveau/nvkm/subdev/pci/gf100.c
> index 00a5e7d3e..8676480c3 100644
> --- a/drm/nouveau/nvkm/subdev/pci/gf100.c
> +++ b/drm/nouveau/nvkm/subdev/pci/gf100.c
> @@ -93,6 +93,7 @@ gf100_pci_func = {
> .pcie.set_version = gf100_pcie_set_version,
> .pcie.version = gf100_pcie_version,
> .pcie.version_supported = g92_pcie_version_supported,
> +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
>  };
>
>  int
> diff --git a/drm/nouveau/nvkm/subdev/pci/gf106.c 
> b/drm/nouveau/nvkm/subdev/pci/gf106.c
> index 11bf419af..8079ebdd4 100644
> --- a/drm/nouveau/nvkm/subdev/pci/gf106.c
> +++ b/drm/nouveau/nvkm/subdev/pci/gf106.c
> @@ -40,6 +40,7 @@ gf106_pci_func = {
> .pcie.set_version = gf100_pcie_set_version,
> .pcie.version = gf100_pcie_version,
> .pcie.version_supported = g92_pcie_version_supported,
> +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
>  };
>
>  int
> diff --git a/drm/nouveau/nvkm/subdev/pci/gk104.c 
> b/drm/nouveau/nvkm/subdev/pci/gk104.c
> index e68030507..b73922c52 100644
> --- a/drm/nouveau/nvkm/subdev/pci/gk104.c
> +++ b/drm/nouveau/nvkm/subdev/pci/gk104.c
> @@ -219,6 +219,7 @@ gk104_pci_func = {
> .pcie.set_version = gf100_pcie_set_version,
> .pcie.version = gf100_pcie_version,
> .pcie.version_supported = gk104_pcie_version_supported,
> +   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
>  };
>
>  int
> diff --git a/drm/nouveau/nvkm/subdev/pci/pcie.c 
> b/drm/nouveau/nvkm/subdev/pci/pcie.c
> index d71e5db50..354ac4c85 100644
> --- a/drm/nouveau/nvkm/subdev/pci/pcie.c
> +++ b/drm/nouveau/nvkm/subdev/pci/pcie.c
> @@ -111,6 +111,14 @@ nvkm_pcie_init(struct nvkm_pci *pci)
> return 0;
>  }
>
> +void
> +nvkm_pcie_force_aspm_off(struct nvkm_pci *pci, bool status)
> +{
> +   if (!pci->func->pcie.force_aspm_off)
> +   return;
> +   pci->func->pcie.force_aspm_off(pci, status);
> +}
> +
>  int
>  nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 
> width)
>  {
> @@ -157,9 +165,15 @@ nvkm_pcie_set_link(struct nvkm_pci *pci, enum 
> nvkm_pcie_speed speed, u8 width)
> nvkm_debug(subdev, "set link to %s x%i\n",
>nvkm_pcie_speeds[speed], width);
>
> +   /* force disable ASPM */
> +   nvkm_pcie_force_aspm_off(pci, true);
> +
> ret = pci->func->pcie.set_link(pci, speed, width);
> if (ret < 0)
> nvkm_error(subdev, "setting link failed: %i\n", ret);
>
> +   /* lift force disable ASPM */
> +   nvkm_pcie_force_aspm_off(pci, 

[Nouveau] [PATCH 1/3] pci: force disable ASPM before changing the link speed

2019-09-12 Thread Karol Herbst
taken from nvgpu

Signed-off-by: Karol Herbst 
---
 drm/nouveau/nvkm/subdev/pci/g84.c   |  9 +
 drm/nouveau/nvkm/subdev/pci/g92.c   |  1 +
 drm/nouveau/nvkm/subdev/pci/g94.c   |  1 +
 drm/nouveau/nvkm/subdev/pci/gf100.c |  1 +
 drm/nouveau/nvkm/subdev/pci/gf106.c |  1 +
 drm/nouveau/nvkm/subdev/pci/gk104.c |  1 +
 drm/nouveau/nvkm/subdev/pci/pcie.c  | 14 ++
 drm/nouveau/nvkm/subdev/pci/priv.h  |  2 ++
 8 files changed, 30 insertions(+)

diff --git a/drm/nouveau/nvkm/subdev/pci/g84.c 
b/drm/nouveau/nvkm/subdev/pci/g84.c
index 62438d892..353d70d7e 100644
--- a/drm/nouveau/nvkm/subdev/pci/g84.c
+++ b/drm/nouveau/nvkm/subdev/pci/g84.c
@@ -122,6 +122,14 @@ g84_pci_init(struct nvkm_pci *pci)
nvkm_pci_mask(pci, 0x041c, 0x0060, 0x);
 }
 
+void
+g84_pcie_force_aspm_off(struct nvkm_pci *pci, bool status)
+{
+   /* L0s and L1 */
+   u32 value = status ? 0x180 : 0x0;
+   nvkm_pci_mask(pci, 0x150, 0x180, value);
+}
+
 int
 g84_pcie_init(struct nvkm_pci *pci)
 {
@@ -147,6 +155,7 @@ g84_pci_func = {
.pcie.set_version = g84_pcie_set_version,
.pcie.version = g84_pcie_version,
.pcie.version_supported = g84_pcie_version_supported,
+   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
 };
 
 int
diff --git a/drm/nouveau/nvkm/subdev/pci/g92.c 
b/drm/nouveau/nvkm/subdev/pci/g92.c
index 48874359d..8c35cc89e 100644
--- a/drm/nouveau/nvkm/subdev/pci/g92.c
+++ b/drm/nouveau/nvkm/subdev/pci/g92.c
@@ -48,6 +48,7 @@ g92_pci_func = {
.pcie.set_version = g84_pcie_set_version,
.pcie.version = g84_pcie_version,
.pcie.version_supported = g92_pcie_version_supported,
+   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
 };
 
 int
diff --git a/drm/nouveau/nvkm/subdev/pci/g94.c 
b/drm/nouveau/nvkm/subdev/pci/g94.c
index 09adb37a5..aa152d798 100644
--- a/drm/nouveau/nvkm/subdev/pci/g94.c
+++ b/drm/nouveau/nvkm/subdev/pci/g94.c
@@ -40,6 +40,7 @@ g94_pci_func = {
.pcie.set_version = g84_pcie_set_version,
.pcie.version = g84_pcie_version,
.pcie.version_supported = g92_pcie_version_supported,
+   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
 };
 
 int
diff --git a/drm/nouveau/nvkm/subdev/pci/gf100.c 
b/drm/nouveau/nvkm/subdev/pci/gf100.c
index 00a5e7d3e..8676480c3 100644
--- a/drm/nouveau/nvkm/subdev/pci/gf100.c
+++ b/drm/nouveau/nvkm/subdev/pci/gf100.c
@@ -93,6 +93,7 @@ gf100_pci_func = {
.pcie.set_version = gf100_pcie_set_version,
.pcie.version = gf100_pcie_version,
.pcie.version_supported = g92_pcie_version_supported,
+   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
 };
 
 int
diff --git a/drm/nouveau/nvkm/subdev/pci/gf106.c 
b/drm/nouveau/nvkm/subdev/pci/gf106.c
index 11bf419af..8079ebdd4 100644
--- a/drm/nouveau/nvkm/subdev/pci/gf106.c
+++ b/drm/nouveau/nvkm/subdev/pci/gf106.c
@@ -40,6 +40,7 @@ gf106_pci_func = {
.pcie.set_version = gf100_pcie_set_version,
.pcie.version = gf100_pcie_version,
.pcie.version_supported = g92_pcie_version_supported,
+   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
 };
 
 int
diff --git a/drm/nouveau/nvkm/subdev/pci/gk104.c 
b/drm/nouveau/nvkm/subdev/pci/gk104.c
index e68030507..b73922c52 100644
--- a/drm/nouveau/nvkm/subdev/pci/gk104.c
+++ b/drm/nouveau/nvkm/subdev/pci/gk104.c
@@ -219,6 +219,7 @@ gk104_pci_func = {
.pcie.set_version = gf100_pcie_set_version,
.pcie.version = gf100_pcie_version,
.pcie.version_supported = gk104_pcie_version_supported,
+   .pcie.force_aspm_off = g84_pcie_force_aspm_off,
 };
 
 int
diff --git a/drm/nouveau/nvkm/subdev/pci/pcie.c 
b/drm/nouveau/nvkm/subdev/pci/pcie.c
index d71e5db50..354ac4c85 100644
--- a/drm/nouveau/nvkm/subdev/pci/pcie.c
+++ b/drm/nouveau/nvkm/subdev/pci/pcie.c
@@ -111,6 +111,14 @@ nvkm_pcie_init(struct nvkm_pci *pci)
return 0;
 }
 
+void
+nvkm_pcie_force_aspm_off(struct nvkm_pci *pci, bool status)
+{
+   if (!pci->func->pcie.force_aspm_off)
+   return;
+   pci->func->pcie.force_aspm_off(pci, status);
+}
+
 int
 nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width)
 {
@@ -157,9 +165,15 @@ nvkm_pcie_set_link(struct nvkm_pci *pci, enum 
nvkm_pcie_speed speed, u8 width)
nvkm_debug(subdev, "set link to %s x%i\n",
   nvkm_pcie_speeds[speed], width);
 
+   /* force disable ASPM */
+   nvkm_pcie_force_aspm_off(pci, true);
+
ret = pci->func->pcie.set_link(pci, speed, width);
if (ret < 0)
nvkm_error(subdev, "setting link failed: %i\n", ret);
 
+   /* lift force disable ASPM */
+   nvkm_pcie_force_aspm_off(pci, false);
+
return ret;
 }
diff --git a/drm/nouveau/nvkm/subdev/pci/priv.h 
b/drm/nouveau/nvkm/subdev/pci/priv.h
index 7009aad86..c6a9ef330 100644
--- a/drm/nouveau/nvkm/subdev/pci/priv.h
+++ b/drm/nouveau/nvkm/subdev/pci/priv.h
@@ -24,6 +24,7 @@ struct nvkm_pci_func {
void (*set_version)(struct