[PATCH v10 0/13] Add support for RaspberryPi RP1 PCI device using a DT overlay
Andrea della Porta
andrea.porta at suse.com
Thu May 29 04:23:35 PDT 2025
*** RESENDING PATCHSET SINCE LAST ONE HAS CLOBBERED SEQUENCE NUMBER ***
RP1 is an MFD chipset that acts as a south-bridge PCIe endpoint sporting
a pletora of subdevices (i.e. Ethernet, USB host controller, I2C, PWM,
etc.) whose registers are all reachable starting from an offset from the
BAR address. The main point here is that while the RP1 as an endpoint
itself is discoverable via usual PCI enumeraiton, the devices it contains
are not discoverable and must be declared e.g. via the devicetree.
This patchset is an attempt to provide a minimum infrastructure to allow
the RP1 chipset to be discovered and perpherals it contains to be added
from a devictree overlay loaded during RP1 PCI endpoint enumeration. To
ensure compatibility with downstream, a devicetree already comprising the
RP1 node is also provided, so it's not strictly necessary to use the
dynamically loaded overlay if the devicetree is already fully defined at
the origin.
To achieve this modularity, the RP1 node DT definitions are arranged by
file inclusion as per following schema (the arrow points to the includer,
see also [9]):
rp1-pci.dtso rp1.dtso
^ ^
| |
rp1-common.dtsi ----> rp1-nexus.dtsi ----> bcm2712-rpi-5-b.dts
^
|
bcm2712-rpi-5-b-ovl-rp1.dts
Followup patches should add support for the several peripherals contained
in RP1.
This work is based upon dowstream drivers code and the proposal from RH
et al. (see [1] and [2]). A similar approach is also pursued in [3].
The patches are ordered as follows:
-PATCHES 1 to 3: add binding schemas for clock, gpio and RP1 peripherals.
They are needed to support the other peripherals, e.g. the ethernet mac
depends on a clock generated by RP1 and the phy is reset through the
on-board gpio controller.
-PATCH 4 and 5: add clock and gpio device drivers.
-PATCH 6: the devicetree node describing the RP1 chipset.
-PATCH 7: this is the main patch to support RP1 chipset. It can work
either with a fully defined devicetree (i.e. one that already included
the rp1 node since boot time) or with a runtime loaded dtb overlay
which is linked as binary blob in the driver obj. This duality is
useful to comply with both downstream and upstream needs (see [9]).
The real dtso is in devicetree folder while the dtso in driver folder is
just a placeholder to include the real dtso.
In this way it is possible to check the dtso against dt-bindings.
The reason why drivers/misc has been selected as containing folder
for this driver can be seen in [6], [7] and [8].
-PATCH 8: add the external clock node (used by RP1) to the main dts.
-PATCH 9: the fully fledged devictree containing also the rp1 node.
This devicetree is functionally similar to the one downstream is using.
-PATCH 10 (OPTIONAL): this patch introduces a new scenario about how
the rp1 node is specified and loaded in DT. On top of the base DT
(without rp1 node), the fw loads this overlay and the end result is
the same devicetree as in patch 9, which is then passed to the next
stage (either the kernel or u-boot/bootloader).
While this patch is not strictly necessary and can therefore be dropped
(see [10]), it's not introducing much extra work and maybe can come
in handy while debugging.
-PATCH 11: add the relevant kernel CONFIG_ options to defconfig.
-PATCH 12: enable CONFIG_OF_OVERLAY in order for 'make defconfig'
to produce a configuration valid for the RP1 driver. Without this
patch, the user has to explicitly enable it since the misc driver
depends on OF_OVERLAY.
-PATCH 13: collect all changes for MAINTAINERS file.
This patchset is also a first attempt to be more agnostic wrt hardware
description standards such as OF devicetree and ACPI, where 'agnostic'
means "using DT in coexistence with ACPI", as been already promoted
by e.g. AL (see [4]). Although there's currently no evidence it will also
run out of the box on purely ACPI system, it is a first step towards
that direction.
Many thanks,
Andrea della Porta
Links:
- [1]: https://lpc.events/event/17/contributions/1421/attachments/1337/2680/LPC2023%20Non-discoverable%20devices%20in%20PCI.pdf
- [2]: https://lore.kernel.org/lkml/20230419231155.GA899497-robh@kernel.org/t/
- [3]: https://lore.kernel.org/all/20240808154658.247873-1-herve.codina@bootlin.com/#t
- [4]: https://lore.kernel.org/all/73e05c77-6d53-4aae-95ac-415456ff0ae4@lunn.ch/
- [5]: https://lore.kernel.org/all/20240626104544.14233-1-svarbanov@suse.de/
- [6]: https://lore.kernel.org/all/20240612140208.GC1504919@google.com/
- [7]: https://lore.kernel.org/all/83f7fa09-d0e6-4f36-a27d-cee08979be2a@app.fastmail.com/
- [8]: https://lore.kernel.org/all/2024081356-mutable-everyday-6f9d@gregkh/
- [9]: https://lore.kernel.org/all/Z87wTfChRC5Ruwc0@apocalypse/
- [10]: https://lore.kernel.org/all/CAMEGJJ0f4YUgdWBhxvQ_dquZHztve9KO7pvQjoDWJ3=zd3cgcg@mail.gmail.com/#t
CHANGES IN V10
PATCH RELATED -------------------------------------------------
- Patch 10,11,12: Added: Reviewed-by: Reviewed-by: Florian Fainelli <florian.fainelli at broadcom.com>
- Patches reworked to apply cleanly on broadcom/stblinux branches:
patch 1,2,3,6,8,9,10 -> devicetree/next
patch 11,12 -> defconfig/next
patch 4,5,7 -> drivers/next
patch 13 -> maintainers/next
- Patch 13: new patch gathering all changes for MAINTAINERS
RP1 CLOCK DRIVER ------------------------------------
- Dropped some WARN_ONCE() lines that are basically useless
- rp1_clock_set_parent() now returns EINVAL in case the parent check
is failing. As a result, rp1_clock_set_rate_and_parent() has also
been adapted to return rp1_clock_set_parent() retcode.
- Return an ERR_PTR from rp1_register_clock() instead of just NULL
- Dropped some unaesthetic blank lines
- Disabled the builtin locking in regmap since we're already dealing
with concurrency in the code
- rp1_clk_probe(): dropped dev_err_probe() as redundant due to commit
12a0fd23e870 ("clk: Print an error when clk registration fails")
More information about the linux-arm-kernel
mailing list