All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Frank Li <Frank.li@nxp.com>
Cc: "Rob Herring" <robh@kernel.org>,
	"Saravana Kannan" <saravanak@google.com>,
	"Jingoo Han" <jingoohan1@gmail.com>,
	"Manivannan Sadhasivam" <manivannan.sadhasivam@linaro.org>,
	"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
	"Krzysztof Wilczyński" <kw@linux.com>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Richard Zhu" <hongxing.zhu@nxp.com>,
	"Lucas Stach" <l.stach@pengutronix.de>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Fabio Estevam" <festevam@gmail.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	imx@lists.linux.dev
Subject: Re: [PATCH v8 2/7] PCI: dwc: Use devicetree 'ranges' property to get rid of cpu_addr_fixup() callback
Date: Thu, 23 Jan 2025 13:09:00 -0600	[thread overview]
Message-ID: <20250123190900.GA650360@bhelgaas> (raw)
In-Reply-To: <Z4p6bekWQ7t7ZDS8@lizhi-Precision-Tower-5810>

On Fri, Jan 17, 2025 at 10:42:37AM -0500, Frank Li wrote:
> On Thu, Jan 16, 2025 at 05:29:16PM -0600, Bjorn Helgaas wrote:
> > On Thu, Jan 16, 2025 at 05:14:00PM -0600, Bjorn Helgaas wrote:
> > > On Tue, Nov 19, 2024 at 02:44:20PM -0500, Frank Li wrote:
> > > > parent_bus_addr in struct of_range can indicate address information just
> > > > ahead of PCIe controller. Most system's bus fabric use 1:1 map between
> > > > input and output address. but some hardware like i.MX8QXP doesn't use 1:1
> > > > map. See below diagram:
> > > >
> > > >             ┌─────────┐                    ┌────────────┐
> > > >  ┌─────┐    │         │ IA: 0x8ff8_0000    │            │
> > > >  │ CPU ├───►│   ┌────►├─────────────────┐  │ PCI        │
> > > >  └─────┘    │   │     │ IA: 0x8ff0_0000 │  │            │
> > > >   CPU Addr  │   │  ┌─►├─────────────┐   │  │ Controller │
> > > > 0x7ff8_0000─┼───┘  │  │             │   │  │            │
> > > >             │      │  │             │   │  │            │   PCI Addr
> > > > 0x7ff0_0000─┼──────┘  │             │   └──► IOSpace   ─┼────────────►
> > > >             │         │             │      │            │    0
> > > > 0x7000_0000─┼────────►├─────────┐   │      │            │
> > > >             └─────────┘         │   └──────► CfgSpace  ─┼────────────►
> > > >              BUS Fabric         │          │            │    0
> > > >                                 │          │            │
> > > >                                 └──────────► MemSpace  ─┼────────────►
> > > >                         IA: 0x8000_0000    │            │  0x8000_0000
> > > >                                            └────────────┘
> > > >
> > > > bus@5f000000 {
> > > > 	compatible = "simple-bus";
> > > > 	#address-cells = <1>;
> > > > 	#size-cells = <1>;
> > > > 	ranges = <0x80000000 0x0 0x70000000 0x10000000>;
> > > >
> > > > 	pcie@5f010000 {
> > > > 		compatible = "fsl,imx8q-pcie";
> > > > 		reg = <0x5f010000 0x10000>, <0x8ff00000 0x80000>;
> > > > 		reg-names = "dbi", "config";
> > > > 		#address-cells = <3>;
> > > > 		#size-cells = <2>;
> > > > 		device_type = "pci";
> > > > 		bus-range = <0x00 0xff>;
> > > > 		ranges = <0x81000000 0 0x00000000 0x8ff80000 0 0x00010000>,
> > > > 			 <0x82000000 0 0x80000000 0x80000000 0 0x0ff00000>;
> > > > 	...
> > > > 	};
> > > > };
> > > >
> > > > Term internal address (IA) here means the address just before PCIe
> > > > controller. After ATU use this IA instead CPU address, cpu_addr_fixup() can
> > > > be removed.
> > >
> > > > @@ -730,9 +779,15 @@ static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp)
> > > >
> > > >  		atu.index = i;
> > > >  		atu.type = PCIE_ATU_TYPE_MEM;
> > > > -		atu.cpu_addr = entry->res->start;
> > > > +		parent_bus_addr = entry->res->start;
> > > >  		atu.pci_addr = entry->res->start - entry->offset;
> > > >
> > > > +		ret = dw_pcie_get_parent_addr(pci, entry->res->start, &parent_bus_addr);
> > > > +		if (ret)
> > > > +			return ret;
> > > > +
> > > > +		atu.cpu_addr = parent_bus_addr;
> > >
> > > Here you set atu.cpu_addr to the intermediate bus address instead
> > > of the CPU physical address before calling
> > > dw_pcie_prog_outbound_atu().
> > >
> > > But what about other callers of dw_pcie_prog_outbound_atu()?  Don't
> > > all of them need to use the intermediate bus address?
> 
> All should use "intermediate bus address", RC side only call it here. EP
> side is here
> https://lore.kernel.org/imx/Z4p0fUAK1ONNjLst@lizhi-Precision-Tower-5810/T/#t

Currently dw_pcie_prog_outbound_atu() uses atu->cpu_addr, calls
ops->cpu_addr_fixup() if defined, and writes cpu_addr to
PCIE_ATU_LOWER_BASE/PCIE_ATU_UPPER_BASE.

The callers of dw_pcie_prog_outbound_atu() I see are:

  dw_pcie_ep_outbound_atu
    atu.cpu_addr came from dw_pcie_ep_map_addr(), so it's a CPU
    address.  Fixed by [1], which reads ep->bus_addr_base from the
    "addr_space" 'reg' property.

  dw_pcie_other_conf_map_bus
    atu.cpu_addr came from pp->cfg0_base, set by dw_pcie_host_init()
    to a CPU address (the "config" resource).  Fixed by [2], which
    overwrites pp->cfg0_base with the address from the "config" 'reg'
    property if 'use_parent_dt_ranges' is set.

  dw_pcie_rd_other_conf
  dw_pcie_wr_other_conf
    dw_pcie_prog_outbound_atu() only called if pp->cfg0_io_shared,
    after an ECAM map via dw_pcie_other_conf_map_bus() and subsequent
    successful access; atu.cpu_addr came from pp->io_base, set by
    dw_pcie_host_init() from pci_pio_to_address(), which I'm pretty
    sure returns a CPU address.

    So this still looks wrong to me.  In addition, I think doing the
    ATU setup in *_map() and restore in *rd/wr_other_conf() is ugly
    and looks unreliable.

  dw_pcie_iatu_setup
    atu.cpu_addr came from the struct resource in pp->bridge->windows,
    so it's a CPU address.  Also fixed by [2], which overwrites
    atu.cpu_addr with the address from dw_pcie_get_parent_addr(), which
    iterates through the PCI controller's 'ranges' property and
    returns the range.parent_bus_addr.

  dw_pcie_pme_turn_off
    atu.cpu_addr came from pp.msg_res, set by
    dw_pcie_host_request_msg_tlp_res() to a CPU address at the end of
    the first MMIO bridge window.  This one also looks wrong to me.

[1] https://lore.kernel.org/r/20241119-pci_fixup_addr-v8-3-c4bfa5193288@nxp.com
[2] https://lore.kernel.org/r/20241119-pci_fixup_addr-v8-2-c4bfa5193288@nxp.com

> > Since dw_pcie_prog_outbound_atu() is the only dwc caller, maybe the
> > parent_bus_addr change should go *there* instead of in the callers?
> 
> I am not sure I understand your means.
> 
> EP and RC parts need call dw_pcie_prog_outbound_atu(). EP and RC use
> difference method to get outbound windows information. So can't move it
> into dw_pcie_prog_outbound_atu().

Yes, I think I see what you mean.  In the Endpoint case, the iATU
input comes from the "addr_space" 'reg' property.  In the Root Complex
case, it comes from the parent bus address of the 'ranges' property.

Bjorn

  parent reply	other threads:[~2025-01-23 19:09 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-19 19:44 [PATCH v8 0/7] PCI: dwc: opitimaze RC Host/EP pci_fixup_addr() Frank Li
2024-11-19 19:44 ` [PATCH v8 1/7] of: address: Add parent_bus_addr to struct of_pci_range Frank Li
2024-11-19 19:44 ` [PATCH v8 2/7] PCI: dwc: Use devicetree 'ranges' property to get rid of cpu_addr_fixup() callback Frank Li
2024-11-24 14:33   ` Manivannan Sadhasivam
2025-01-16  1:47     ` Krzysztof Wilczyński
2025-01-16  1:56       ` Frank Li
2025-01-16 23:13   ` Bjorn Helgaas
2025-01-16 23:29     ` Bjorn Helgaas
2025-01-17 15:42       ` Frank Li
2025-01-23 15:21         ` Frank Li
2025-01-23 19:04           ` Bjorn Helgaas
2025-01-23 19:15             ` Frank Li
2025-01-27 15:24               ` Niklas Cassel
2025-01-23 19:09         ` Bjorn Helgaas [this message]
2025-01-17 15:50     ` Frank Li
2024-11-19 19:44 ` [PATCH v8 3/7] PCI: dwc: ep: Add bus_addr_base for outbound window Frank Li
2025-01-16 15:32   ` Bjorn Helgaas
2025-01-16 18:04     ` Frank Li
2025-01-16 19:45       ` Bjorn Helgaas
2025-01-16 20:02         ` Frank Li
2025-01-16 22:49           ` Bjorn Helgaas
2025-01-17 14:35             ` Manivannan Sadhasivam
2025-01-17 15:17               ` Frank Li
2024-11-19 19:44 ` [PATCH v8 4/7] PCI: imx6: Remove cpu_addr_fixup() Frank Li
2024-11-19 19:44 ` [PATCH v8 5/7] dt-bindings: PCI: fsl,imx6q-pcie-ep: Add compatible string fsl,imx8q-pcie-ep Frank Li
2024-11-19 19:44 ` [PATCH v8 6/7] PCI: imx6: Pass correct sub mode when calling phy_set_mode_ext() Frank Li
2024-11-19 19:44 ` [PATCH v8 7/7] PCI: imx6: Add i.MX8Q PCIe Endpoint (EP) support Frank Li
2024-11-24 14:38 ` [PATCH v8 0/7] PCI: dwc: opitimaze RC Host/EP pci_fixup_addr() Manivannan Sadhasivam
2024-12-10 22:16   ` Frank Li
2024-12-19 19:55     ` Frank Li
2025-01-06 17:14       ` Frank Li
2025-01-07 17:59         ` Frank Li
2025-01-16  1:56         ` Krzysztof Wilczyński
2025-01-15 11:42 ` Krzysztof Wilczyński

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250123190900.GA650360@bhelgaas \
    --to=helgaas@kernel.org \
    --cc=Frank.li@nxp.com \
    --cc=bhelgaas@google.com \
    --cc=devicetree@vger.kernel.org \
    --cc=festevam@gmail.com \
    --cc=hongxing.zhu@nxp.com \
    --cc=imx@lists.linux.dev \
    --cc=jingoohan1@gmail.com \
    --cc=kernel@pengutronix.de \
    --cc=kw@linux.com \
    --cc=l.stach@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lpieralisi@kernel.org \
    --cc=manivannan.sadhasivam@linaro.org \
    --cc=robh@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=saravanak@google.com \
    --cc=shawnguo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.