On Wed, Feb 08, 2023 at 10:43:21AM -0800, Ganapatrao Kulkarni wrote: > As per PCIe specification(section 10.5), If a VF implements an > ATS capability, its associated PF must implement an ATS capability. > The ATS Capabilities in VFs and their associated PFs are permitted to > be enabled independently. > Also, it states that the Smallest Translation Unit (STU) for VFs must be > hardwired to Zero and the associated PF's value applies to VFs STU. > > The current code allows to enable ATS on VFs only if it is already > enabled on associated PF, which is not necessary as per the specification. > > It is only required to have valid STU programmed on PF to enable > ATS on VFs. Adding code to write the first VFs STU to a PF's STU > when PFs ATS is not enabled. Can you please add here quotes from the spec and its version? I don't see anything like this in my version of PCIe specification. Thanks > > Signed-off-by: Ganapatrao Kulkarni <gankulkarni@xxxxxxxxxxxxxxxxxxxxxx> > --- > drivers/pci/ats.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c > index f9cc2e10b676..a97ec67201d1 100644 > --- a/drivers/pci/ats.c > +++ b/drivers/pci/ats.c > @@ -67,13 +67,20 @@ int pci_enable_ats(struct pci_dev *dev, int ps) > if (ps < PCI_ATS_MIN_STU) > return -EINVAL; > > - /* > - * Note that enabling ATS on a VF fails unless it's already enabled > - * with the same STU on the PF. > - */ > ctrl = PCI_ATS_CTRL_ENABLE; > if (dev->is_virtfn) { > pdev = pci_physfn(dev); > + > + if (!pdev->ats_enabled && > + (pdev->ats_stu < PCI_ATS_MIN_STU)) { > + u16 ctrl2; > + > + /* Associated PF's STU value applies to VFs. */ > + pdev->ats_stu = ps; > + ctrl2 = PCI_ATS_CTRL_STU(pdev->ats_stu - PCI_ATS_MIN_STU); > + pci_write_config_word(pdev, pdev->ats_cap + PCI_ATS_CTRL, ctrl2); > + } > + > if (pdev->ats_stu != ps) > return -EINVAL; > } else { > -- > 2.39.1 >