On Thu, Sep 8, 2022 at 12:12 PM Bjorn Helgaas <helgaas@xxxxxxxxxx> wrote: > > [+cc Evan, author of 62f8f5c3bfc2 ("drm/amdgpu: enable ASPM support > for PCIE 7.4.0/7.6.0")] > > On Thu, Sep 08, 2022 at 08:53:44AM +0530, Lijo Lazar wrote: > > As per PCIE Base Spec r4.0 Section 6.18 > > 'Software must not enable LTR in an Endpoint unless the Root Complex > > and all intermediate Switches indicate support for LTR.' > > > > This fixes the Unsupported Request error reported through AER during > > ASPM enablement. > > > > Link: https://bugzilla.kernel.org/show_bug.cgi?id=216455 > > > > The error was unnoticed before and got visible because of the commit > > referenced below. This doesn't fix anything in the commit below, rather > > fixes the issue in amdgpu exposed by the commit. The reference is only > > to associate this commit with below one so that both go together. > > > > Fixes: 8795e182b02d ("PCI/portdrv: Don't disable AER reporting in get_port_device_capability()") > > > > Reported-by: Gustaw Smolarczyk <wielkiegie@xxxxxxxxx> > > Signed-off-by: Lijo Lazar <lijo.lazar@xxxxxxx> > > Cc: stable@xxxxxxxxxxxxxxx > > --- > > drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c | 9 ++++++++- > > drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c | 9 ++++++++- > > drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c | 9 ++++++++- > > nbio_v4_3_program_ltr() checks pdev->ltr_path itself instead of doing > it in *_program_aspm(). It'd be nice to use the same approach for all > versions. > > I really don't like the fact that amdgpu does all this ASPM fiddling > in the driver in the first place. ASPM should be configured by the > PCI core, not by each individual driver. ASPM has all sorts of > requirements that relate to upstream devices, which I think amdgpu > ignores, but the core pays attention to. > > Do you know why the driver configures ASPM itself? If the PCI core is > doing something wrong (and I'm sure it is, ASPM support is kind of a > mess), I'd much prefer to fix up the core where *all* drivers can > benefit from it. This is the programming sequence we get from our hardware team and it is used on both windows and Linux. As far as I understand it windows doesn't handle this in the core, it's up to the individual drivers to enable it. I'm not familiar with how this should be enabled generically, but at least for our hardware, it seems to have some variation compared to what is done in the PCI core due to stability, etc. It seems to me that this may need asic specific implementations for a lot of hardware depending on the required programming sequences. E.g., various asics may need hardware workaround for bugs or platform issues, etc. I can ask for more details from our hardware team. Alex > > > diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c b/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c > > index b465baa26762..aa761ff3a5fa 100644 > > --- a/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c > > +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c > > @@ -380,6 +380,7 @@ static void nbio_v2_3_enable_aspm(struct amdgpu_device *adev, > > WREG32_PCIE(smnPCIE_LC_CNTL, data); > > } > > > > +#ifdef CONFIG_PCIEASPM > > static void nbio_v2_3_program_ltr(struct amdgpu_device *adev) > > { > > uint32_t def, data; > > @@ -401,9 +402,11 @@ static void nbio_v2_3_program_ltr(struct amdgpu_device *adev) > > if (def != data) > > WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2, data); > > } > > +#endif > > > > static void nbio_v2_3_program_aspm(struct amdgpu_device *adev) > > { > > +#ifdef CONFIG_PCIEASPM > > uint32_t def, data; > > > > def = data = RREG32_PCIE(smnPCIE_LC_CNTL); > > @@ -459,7 +462,10 @@ static void nbio_v2_3_program_aspm(struct amdgpu_device *adev) > > if (def != data) > > WREG32_PCIE(smnPCIE_LC_CNTL6, data); > > > > - nbio_v2_3_program_ltr(adev); > > + /* Don't bother about LTR if LTR is not enabled > > + * in the path */ > > + if (adev->pdev->ltr_path) > > + nbio_v2_3_program_ltr(adev); > > > > def = data = RREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP3); > > data |= 0x5DE0 << RCC_BIF_STRAP3__STRAP_VLINK_ASPM_IDLE_TIMER__SHIFT; > > @@ -483,6 +489,7 @@ static void nbio_v2_3_program_aspm(struct amdgpu_device *adev) > > data &= ~PCIE_LC_CNTL3__LC_DSC_DONT_ENTER_L23_AFTER_PME_ACK_MASK; > > if (def != data) > > WREG32_PCIE(smnPCIE_LC_CNTL3, data); > > +#endif > > }