[PATCH] arm64: dts: fvp: Add virtio-rng support

Andre Przywara andre.przywara at arm.com
Tue Apr 26 06:24:19 PDT 2022


On Thu, 21 Apr 2022 15:35:21 +0100
Diego Sueiro <diego.sueiro at arm.com> wrote:

Hi,

> The virtio-rng is available from FVP_Base_RevC-2xAEMvA version 11.17, so add
> the devicetree node to support it.

The change looks good, although it probably deserves to mention the reason
for keeping it "disabled" by default (older FVP versions not having the
device, so they throw an SError on probe).

But when testing it, I discovered that there is some problem with later
kernels. It works fine up to v5.15, but breaks later on. I bisected it
down to:

=============
commit 9a4b612d675b03f7fc9fa1957ca399c8223f3954
Author: Laurent Vivier <lvivier at redhat.com>
Date:   Thu Oct 28 12:11:11 2021 +0200
    
    hwrng: virtio - always add a pending request

    If we ensure we have already some data available by enqueuing
    again the buffer once data are exhausted, we can return what we
    have without waiting for the device answer.
=============

The effect is that any access to /dev/hwrng hangs, it looks like it's
waiting for an interrupt to fire (core goes to WFI). The process reading
the char dev can be Ctrl-C'ed, but there will be no output, and the
interrupt counter in /proc/interrupts does not increase.
It works fine with any kernel under QEMU, but definitely breaks the FVP
usage (reverting that patch makes it work again on mainline).

I didn't have a closer look yet (and have limited knowledge about the
internals of virtio and virtio-rng in particular), but was wondering if
someone could give a hint at what could be the issue or the direction to
debug that?

Cheers,
Andre

> Signed-off-by: Diego Sueiro <diego.sueiro at arm.com>
> ---
>  arch/arm64/boot/dts/arm/fvp-base-revc.dts            | 3 ++-
>  arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi | 7 +++++++
>  arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi     | 2 +-
>  3 files changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/arm/fvp-base-revc.dts b/arch/arm64/boot/dts/arm/fvp-base-revc.dts
> index 269b649934b5..a496e39e6204 100644
> --- a/arch/arm64/boot/dts/arm/fvp-base-revc.dts
> +++ b/arch/arm64/boot/dts/arm/fvp-base-revc.dts
> @@ -241,6 +241,7 @@ bus at 8000000 {
>  				<0 0 41 &gic 0 0 GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
>  				<0 0 42 &gic 0 0 GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
>  				<0 0 43 &gic 0 0 GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>,
> -				<0 0 44 &gic 0 0 GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
> +				<0 0 44 &gic 0 0 GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>,
> +				<0 0 46 &gic 0 0 GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
>  	};
>  };
> diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi
> index 33182d9e5826..1b6326514c97 100644
> --- a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi
> +++ b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi
> @@ -21,6 +21,13 @@ virtio-net at 150000 {
>  					reg = <0x150000 0x200>;
>  					interrupts = <44>;
>  				};
> +
> +				virtio-rng at 200000 {
> +					compatible = "virtio,mmio";
> +					reg = <0x200000 0x200>;
> +					interrupts = <46>;
> +					status = "disabled";
> +				};
>  			};
>  		};
>  	};
> diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi
> index 5f6cab668aa0..a999e7f52d8b 100644
> --- a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi
> +++ b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi
> @@ -110,7 +110,7 @@ iofpga-bus at 300000000 {
>  				compatible = "simple-bus";
>  				#address-cells = <1>;
>  				#size-cells = <1>;
> -				ranges = <0 3 0 0x200000>;
> +				ranges = <0 3 0 0x210000>;
>  
>  				v2m_sysreg: sysreg at 10000 {
>  					compatible = "arm,vexpress-sysreg";




More information about the linux-arm-kernel mailing list