[PATCH] arm64: dts: rockchip: adjust SMMU interrupt type
Robin Murphy
robin.murphy at arm.com
Tue Feb 11 10:17:56 PST 2025
On 2025-02-11 12:22 pm, Niklas Cassel wrote:
> On Tue, Feb 11, 2025 at 08:40:25AM +0100, Heiko Stübner wrote:
>> Am Montag, 10. Februar 2025, 22:37:29 MEZ schrieb Patrick Wildt:
>>> The SMMU architecture requires wired interrupts to be edge triggered,
>>> which does not align with the DT description for the RK3588. This leads
>>> to interrupt storms, as the SMMU continues to hold the pin high and only
>>> pulls it down for a short amount when issuing an IRQ. Update the DT
>>> description to be in line with the spec and perceived reality.
>>>
>>
>> Cc'ed Niklas
>>
>> This should probably also get a
>>
>> Fixes: cd81d3a0695c ("arm64: dts: rockchip: add rk3588 pcie and php IOMMUs")
>
> Agreed.
>
>
>>
>>> Signed-off-by: Patrick Wildt <patrick at blueri.se>
>>> ---
>>> arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 16 ++++++++--------
>>> 1 file changed, 8 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
>>> index 8cfa30837ce7..520d0814a4de 100644
>>> --- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
>>> +++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi
>>> @@ -549,10 +549,10 @@ usb_host2_xhci: usb at fcd00000 {
>>> mmu600_pcie: iommu at fc900000 {
>>> compatible = "arm,smmu-v3";
>>> reg = <0x0 0xfc900000 0x0 0x200000>;
>>> - interrupts = <GIC_SPI 369 IRQ_TYPE_LEVEL_HIGH 0>,
>>> - <GIC_SPI 371 IRQ_TYPE_LEVEL_HIGH 0>,
>>> - <GIC_SPI 374 IRQ_TYPE_LEVEL_HIGH 0>,
>>> - <GIC_SPI 367 IRQ_TYPE_LEVEL_HIGH 0>;
>>> + interrupts = <GIC_SPI 369 IRQ_TYPE_EDGE_RISING 0>,
>>> + <GIC_SPI 371 IRQ_TYPE_EDGE_RISING 0>,
>>> + <GIC_SPI 374 IRQ_TYPE_EDGE_RISING 0>,
>>> + <GIC_SPI 367 IRQ_TYPE_EDGE_RISING 0>;
>>> interrupt-names = "eventq", "gerror", "priq", "cmdq-sync";
>>> #iommu-cells = <1>;
>>> };
>>> @@ -560,10 +560,10 @@ mmu600_pcie: iommu at fc900000 {
>>> mmu600_php: iommu at fcb00000 {
>>> compatible = "arm,smmu-v3";
>>> reg = <0x0 0xfcb00000 0x0 0x200000>;
>>> - interrupts = <GIC_SPI 381 IRQ_TYPE_LEVEL_HIGH 0>,
>>> - <GIC_SPI 383 IRQ_TYPE_LEVEL_HIGH 0>,
>>> - <GIC_SPI 386 IRQ_TYPE_LEVEL_HIGH 0>,
>>> - <GIC_SPI 379 IRQ_TYPE_LEVEL_HIGH 0>;
>>> + interrupts = <GIC_SPI 381 IRQ_TYPE_EDGE_RISING 0>,
>>> + <GIC_SPI 383 IRQ_TYPE_EDGE_RISING 0>,
>>> + <GIC_SPI 386 IRQ_TYPE_EDGE_RISING 0>,
>>> + <GIC_SPI 379 IRQ_TYPE_EDGE_RISING 0>;
>>> interrupt-names = "eventq", "gerror", "priq", "cmdq-sync";
>>> #iommu-cells = <1>;
>>> status = "disabled";
>>>
>
> Patrick, thank you for the patch!
>
> FWIW, they have the same bug in downstream:
> https://github.com/radxa/kernel/blob/linux-6.1-stan-rkr4.1/arch/arm64/boot/dts/rockchip/rk3588s.dtsi#L2761-L2783
>
> However, the Rockchip PCIe Virtualization Developer Guide correctly define
> the IRQs as edge triggered:
> https://dl.radxa.com/users/dev/Rockchip_PCIe_Virtualization_Developer_Guide_CN.pdf
>
> Looking at the ARM SMMUv3 architecture specification:
> "An implementation must support one of, or optionally both of, wired
> interrupts and MSIs. Whether an implementation supports MSIs is discoverable
> from SMMU_IDR0.MSI and SMMU_S_IDR0.MSI. An implementation might support wired
> interrupt outputs that are edge-triggered. The discovery of support for wired
> interrupts is IMPLEMENTATION DEFINED."
Yup, rising edge is certainly what MMU-600 spits out.
Thanks,
Robin.
>
> Thus:
> Reviewed-by: Niklas Cassel <cassel at kernel.org>
>
>
> Heiko, this patch should go to 6.14.
>
> Side note: We also have another SMMU patch that should go to 6.14:
> https://lore.kernel.org/linux-rockchip/20250207143900.2047949-2-cassel@kernel.org/
>
>
> Kind regards,
> Niklas
More information about the Linux-rockchip
mailing list