lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <aMgqLy6oIrzVV7JO@lizhi-Precision-Tower-5810>
Date: Mon, 15 Sep 2025 11:01:03 -0400
From: Frank Li <Frank.li@....com>
To: Manivannan Sadhasivam <mani@...nel.org>
Cc: Krzysztof Wilczyński <kwilczynski@...nel.org>,
	Kishon Vijay Abraham I <kishon@...nel.org>,
	Bjorn Helgaas <bhelgaas@...gle.com>, Jon Mason <jdmason@...zu.us>,
	Dave Jiang <dave.jiang@...el.com>, Allen Hubbe <allenbh@...il.com>,
	linux-pci@...r.kernel.org, linux-kernel@...r.kernel.org,
	ntb@...ts.linux.dev
Subject: Re: [PATCH 1/2] PCI: endpoint: Enhance pci_epf_alloc_space() and
 rename to pci_epf_set_inbound_space()

On Sat, Aug 30, 2025 at 08:16:33PM +0530, Manivannan Sadhasivam wrote:
> On Fri, Aug 15, 2025 at 06:20:53PM GMT, Frank Li wrote:
> > Enhance pci_epf_alloc_space() to handle setting any physical address as
> > inbound memory space, such as an MSI message base address. The function
> > already accounts for different alignment requirements for different BARs,
> > so reuse this logic and rename the function to pci_epf_set_inbound_space().
> >
>
> I don't think combining both APIs is a good idea. One allocates space for
> inbound memory/populates epf_bar and another reuses existing memory/populates
> epf_bar. Combining both, logically makes little sense and another makes the code
> messy.
>
> If you want to reuse the alignment checks and epf_bar setting from
> pci_epf_alloc_space(), then create a separate helper(s) out of it and call from
> both APIs.
>
> > Make pci_epf_alloc_space() inline and call pci_epf_set_inbound_space() with
> > from_space set to true to maintain compatibility.
> >
> > Signed-off-by: Frank Li <Frank.Li@....com>
> > ---
> > ---
> >  drivers/pci/endpoint/pci-epf-core.c | 69 ++++++++++++++++++++++++++++++-------
> >  include/linux/pci-epc.h             |  5 ---
> >  include/linux/pci-epf.h             | 35 ++++++++++++++++---
> >  3 files changed, 87 insertions(+), 22 deletions(-)
> >
> > diff --git a/drivers/pci/endpoint/pci-epf-core.c b/drivers/pci/endpoint/pci-epf-core.c
> > index d54e18872aefc07c655c94c104a347328ff7a432..5b802b1ea3e28a32e38f4ab6a649cb97a2f29b95 100644
> > --- a/drivers/pci/endpoint/pci-epf-core.c
> > +++ b/drivers/pci/endpoint/pci-epf-core.c
> > @@ -249,20 +249,26 @@ void pci_epf_free_space(struct pci_epf *epf, void *addr, enum pci_barno bar,
> >  EXPORT_SYMBOL_GPL(pci_epf_free_space);
> >
> >  /**
> > - * pci_epf_alloc_space() - allocate memory for the PCI EPF register space
> > + * pci_epf_set_inbound_space() - set memory for the PCI EPF inbound address space
> >   * @epf: the EPF device to whom allocate the memory
> >   * @size: the size of the memory that has to be allocated
> >   * @bar: the BAR number corresponding to the allocated register space
> >   * @epc_features: the features provided by the EPC specific to this EPF
> >   * @type: Identifies if the allocation is for primary EPC or secondary EPC
> > + * @from_memory: allocate from system memory
> > + * @inbound_addr: Any physical address space such as MSI message address that
> > + *                work as inbound address space. from_memory need be false.
> >   *
> >   * Invoke to allocate memory for the PCI EPF register space.
> >   * Flag PCI_BASE_ADDRESS_MEM_TYPE_64 will automatically get set if the BAR
> >   * can only be a 64-bit BAR, or if the requested size is larger than 2 GB.
> >   */
> > -void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar,
> > -			  const struct pci_epc_features *epc_features,
> > -			  enum pci_epc_interface_type type)
> > +int pci_epf_set_inbound_space(struct pci_epf *epf, size_t size,
> > +			      enum pci_barno bar,
> > +			      const struct pci_epc_features *epc_features,
> > +			      enum pci_epc_interface_type type,
> > +			      bool from_memory,
> > +			      dma_addr_t inbound_addr)
> >  {
> >  	u64 bar_fixed_size = epc_features->bar[bar].fixed_size;
> >  	size_t aligned_size, align = epc_features->align;
> > @@ -270,7 +276,32 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar,
> >  	dma_addr_t phys_addr;
> >  	struct pci_epc *epc;
> >  	struct device *dev;
> > -	void *space;
> > +	void *space = NULL;
> > +	dma_addr_t up;
> > +
> > +	up = inbound_addr + size - 1;
> > +
> > +	/*
> > +	 *  Bits:            15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
> > +	 *  Inbound_addr:    U  U  U  U  U  U  0 X X X X X X X X X
> > +	 *  Up:              U  U  U  U  U  U  1 X X X X X X X X X
> > +	 *
> > +	 *  U means address bits have not change in Range [Inbound_Addr, Up]
> > +	 *  X means bit 0 or 1.
> > +	 *
> > +	 *  Inbound_addr^Up  0  0  0  0  0  0  1 X X X X X X X X X
> > +	 *  Find first bit 1 pos from MSB, 2 ^ pos windows will cover
> > +	 *  [Inbound_Addr, Up] range.
>
> On what basis this size calculation is used?

Use to bar's base address and size. pci require size is 2^n
If set mmio space 0x1040..0x10a0 space, bar should be start from 0x1000,
size is at least 0x100 to cove 0x1040..0x10a0 space.

Frank

>
> - Mani
>
> --
> மணிவண்ணன் சதாசிவம்

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ