On Mon, Apr 21, 2025 at 11:43:58AM +0530, Aneesh Kumar K.V wrote: > Dan Williams <dan.j.williams@xxxxxxxxx> writes: > > > There are two components to establishing an encrypted link, provisioning > > the stream in Partner Port config-space, and programming the keys into > > the link layer via IDE_KM (IDE Key Management). This new library, > > drivers/pci/ide.c, enables the former. IDE_KM, via a TSM low-level > > driver, is saved for later. > > > .... > > > +/** > > + * pci_ide_stream_setup() - program settings to Selective IDE Stream registers > > + * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port > > + * @ide: registered IDE settings descriptor > > + * > > + * When @pdev is a PCI_EXP_TYPE_ENDPOINT then the PCI_IDE_EP partner > > + * settings are written to @pdev's Selective IDE Stream register block, > > + * and when @pdev is a PCI_EXP_TYPE_ROOT_PORT, the PCI_IDE_RP settings > > + * are selected. > > + */ > > +void pci_ide_stream_setup(struct pci_dev *pdev, struct pci_ide *ide) > > +{ > > + struct pci_ide_partner *settings = to_settings(pdev, ide); > > + int pos; > > + u32 val; > > + > > + if (!settings) > > + return; > > + > > + pos = sel_ide_offset(pdev->nr_link_ide, settings->stream_index, > > + pdev->nr_ide_mem); > > > > This and the similar offset caclulation below needs the EXT_CAP_ID_IDE offset > > modified drivers/pci/ide.c > @@ -10,11 +10,13 @@ > #include <linux/bitfield.h> > #include "pci.h" > > -static int sel_ide_offset(int nr_link_ide, int stream_index, int nr_ide_mem) > +static int sel_ide_offset(struct pci_dev *pdev, int nr_link_ide, > + int stream_index, int nr_ide_mem) > { > int offset; > > - offset = PCI_IDE_LINK_STREAM_0 + nr_link_ide * PCI_IDE_LINK_BLOCK_SIZE; > + offset = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_IDE); > + offset += PCI_IDE_LINK_STREAM_0 + nr_link_ide * PCI_IDE_LINK_BLOCK_SIZE; ide_cap, nr_link_ide, nr_ide_mem are all cached in pci_dev structure at the end of pci_ide_init(). So either use all cached value in pdev (not for pci_ide_init()): static int sel_ide_offset(struct pci_dev *pdev, int stream_index) or don't use any cached value: static int sel_ide_offset(u16 dev_cap, int nr_link_ide, int stream_index, int nr_ide_mem) or keep sel_ide_offset() unchanged, alway do: ide_cap + sel_ide_offset() > > /* > * Assume a constant number of address association resources per > @@ -66,7 +68,7 @@ void pci_ide_init(struct pci_dev *pdev) > nr_streams = min(1 + FIELD_GET(PCI_IDE_CAP_SEL_NUM_MASK, val), > CONFIG_PCI_IDE_STREAM_MAX); > for (int i = 0; i < nr_streams; i++) { > - int offset = sel_ide_offset(nr_link_ide, i, nr_ide_mem); > + int offset = sel_ide_offset(pdev, nr_link_ide, i, nr_ide_mem); > int nr_assoc; > u32 val; With your change, the next line will be broken: - pci_read_config_dword(pdev, ide_cap + offset, &val); + pci_read_config_dword(pdev, offset, &val); Thanks, Yilun