Re: Raspberry Pi5 - RP1 driver - RFC

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 6/11/24 14:05, Stefan Wahren wrote:
Hi Andrea,

i added Jeremy, because AFAIK he was deeply involved in ACPI
implementation of the RPi 4.

I'm not sure what to add here, the RPi4 work was done as an example of using firmware standards to boot multiple OSs with a single boot/firmware interface. Which means ACPI.

Alternatively, the PCIe/SMCCC might be able to make this device look more regular, by putting everything on separate PCIe functions.

OTOH, I don't think this device is particularly special, except maybe to the extent that it doubles down on ideas regarded as best left in the 1990's. The kernel documents how to handle these cases with ACPI _ADR(). A PCI device can create the _ADR nodes by injecting an SSDT into the ACPI namespace via the PCI option ROMs if the platform firmware doesn't provide them. Should it though? If I were doing it I might be tempted to configure the root port in early firmware and hide it from the OS, claiming instead a bunch of platform devices.

IMHO, DT/Linux platforms should probably do something similar to _ADR() for consistency rather than requiring the EP driver to get involved. Further, mixing DT's into a possible ACPI platform is really the worst of both. Even worse if it requires further distro dracut/initrd/grub/etc one off hacking or polluting the initrd or ESP of non RPi platforms to handle the overlay.

So, a custom EP/bus driver option solves the problem on linux for both DT and ACPI implementations if the device type/offsets are hard coded into it. And presumably if there is a follow on device, it would use multiple PCIe functions to avoid all these problems, the ones around securing the platform with an IOMMU, enabling VFIO, and everything else one gets for "free" with a proper PCIe EP.


PS:
The PCIe/SMCC API could probably make all these devices appear as PCIe functions avoiding the need for a monolithic bus or DT/ACPI description to handle it. But that will likely break the second this device is plugged into something with an SMMU (this platform doesn't have one, correct?), and of course if would require all the firmware configured BAR mappings to remain static, which isn't a problem if its presented as an integrated endpoint. If someone is interested in doing it that way then we should talk.



Am 11.06.24 um 17:39 schrieb Andrea della Porta:
Hi,
I'm on the verge of reworking the RP1 driver from downstream in order for it to be
in good shape for upstream inclusion.
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 is an RFC about the correct approach to use
in integrating the driver and registering the subdevices.

I cannot provide much input into the technical discussion, but i would
prefer an approach which works good with DT and ACPI.

Best regards
Stefan

Link:
- [1]: https://github.com/raspberrypi/linux/blob/rpi-6.6.y/arch/arm/boot/dts/broadcom/rp1.dtsi - [2]: https://github.com/raspberrypi/linux/blob/rpi-6.6.y/drivers/mfd/rp1.c - [3]: https://lpc.events/event/17/contributions/1421/attachments/1337/2680/LPC2023%20Non-discoverable%20devices%20in%20PCI.pdf - [4]: https://lore.kernel.org/lkml/20230419231155.GA899497-robh@xxxxxxxxxx/t/
- [5]: https://lore.kernel.org/lkml/Y862WTT03%2FJxXUG8@xxxxxxxxx/






[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux