[PATCH] ARM: dts: ux500: Reserve memory carveouts

David Hildenbrand david at redhat.com
Mon Dec 14 04:21:34 EST 2020


On 13.12.20 23:55, Linus Walleij wrote:
> The Ux500 platforms have some memory carveouts set aside for
> communicating with the modem and for the initial secure software
> (ISSW). These areas are protected by the memory controller
> and will result in an external abort if accessed like common
> read/write memory.
> 
> On the legacy boot loaders, these were set aside by using
> cmdline arguments such as this:
> 
>   mem=96M at 0 mem_mtrace=15M at 96M mem_mshared=1M at 111M
>   mem_modem=16M at 112M mali.mali_mem=32M at 128M mem=96M at 160M
>   hwmem=127M at 256M mem_issw=1M at 383M mem_ram_console=1M at 384M
>   mem=638M at 385M
> 
> Reserve the relevant areas in the device tree instead. The
> "mali", "hwmem", "mem_ram_console" and the trailing 1MB at the
> end of the memory reservations in the list are not relevant for
> the upstream kernel as these are nowadays replaced with
> upstream technologies such as CMA. The modem and ISSW
> reservations are necessary.
> 
> This was manifested in a bug that surfaced in response to
> commit 7fef431be9c9 ("mm/page_alloc: place pages to tail in __free_pages_core()")
> which changes the behaviour of memory allocations
> in such a way that the platform will sooner run into these
> dangerous areas, with "Unhandled fault: imprecise external
> abort (0xc06) at 0xb6fd83dc" or similar: the real reason
> turns out to be that the PTE is pointing right into one of
> the reserved memory areas. We were just lucky until now.
> 
> We need to augment the DB8500 and DB8520 SoCs similarly
> and also create a new include for the DB9500 used in the
> Snowball since this does not have a modem and thus does
> not need the modem memory reservation, albeit it needs
> the ISSW reservation.
> 
> Cc: stable at vger.kernel.org
> Cc: David Hildenbrand <david at redhat.com>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
> ARM SoC folks: please apply this directly for fixes.

Can we come up with a Fixes: tag or has this been broken forever?
(assuming modern boot loaders)

> 
> David: just FYI if you run into more of these type of
> regressions. Actually the patch is unintentionally good
> at smoking out other bugs :D

Thanks for CCing - I'm adding some people that ran into similar issues,
but not sure if the other bugreports are related (or have similar root
causes).

Thanks a lot!

> ---
>  arch/arm/boot/dts/ste-db8500.dtsi  | 38 ++++++++++++++++++++++++++++++
>  arch/arm/boot/dts/ste-db8520.dtsi  | 38 ++++++++++++++++++++++++++++++
>  arch/arm/boot/dts/ste-db9500.dtsi  | 35 +++++++++++++++++++++++++++
>  arch/arm/boot/dts/ste-snowball.dts |  2 +-
>  4 files changed, 112 insertions(+), 1 deletion(-)
>  create mode 100644 arch/arm/boot/dts/ste-db9500.dtsi
> 
> diff --git a/arch/arm/boot/dts/ste-db8500.dtsi b/arch/arm/boot/dts/ste-db8500.dtsi
> index d309fad32229..344d29853bf7 100644
> --- a/arch/arm/boot/dts/ste-db8500.dtsi
> +++ b/arch/arm/boot/dts/ste-db8500.dtsi
> @@ -12,4 +12,42 @@ cpu at 300 {
>  					    200000 0>;
>  		};
>  	};
> +
> +	reserved-memory {
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		ranges;
> +
> +		/* Modem trace memory */
> +		ram at 06000000 {
> +			reg = <0x06000000 0x00f00000>;
> +			no-map;
> +		};
> +
> +		/* Modem shared memory */
> +		ram at 06f00000 {
> +			reg = <0x06f00000 0x00100000>;
> +			no-map;
> +		};
> +
> +		/* Modem private memory */
> +		ram at 07000000 {
> +			reg = <0x07000000 0x01000000>;
> +			no-map;
> +		};
> +
> +		/*
> +		 * Initial Secure Software ISSW memory
> +		 *
> +		 * This is probably only used if the kernel tries
> +		 * to actually call into trustzone to run secure
> +		 * applications, which the mainline kernel probably
> +		 * will not do on this old chipset. But you can never
> +		 * be too careful, so reserve this memory anyway.
> +		 */
> +		ram at 17f00000 {
> +			reg = <0x17f00000 0x00100000>;
> +			no-map;
> +		};
> +	};
>  };
> diff --git a/arch/arm/boot/dts/ste-db8520.dtsi b/arch/arm/boot/dts/ste-db8520.dtsi
> index 48bd8728ae27..287804e9e183 100644
> --- a/arch/arm/boot/dts/ste-db8520.dtsi
> +++ b/arch/arm/boot/dts/ste-db8520.dtsi
> @@ -12,4 +12,42 @@ cpu at 300 {
>  					    200000 0>;
>  		};
>  	};
> +
> +	reserved-memory {
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		ranges;
> +
> +		/* Modem trace memory */
> +		ram at 06000000 {
> +			reg = <0x06000000 0x00f00000>;
> +			no-map;
> +		};
> +
> +		/* Modem shared memory */
> +		ram at 06f00000 {
> +			reg = <0x06f00000 0x00100000>;
> +			no-map;
> +		};
> +
> +		/* Modem private memory */
> +		ram at 07000000 {
> +			reg = <0x07000000 0x01000000>;
> +			no-map;
> +		};
> +
> +		/*
> +		 * Initial Secure Software ISSW memory
> +		 *
> +		 * This is probably only used if the kernel tries
> +		 * to actually call into trustzone to run secure
> +		 * applications, which the mainline kernel probably
> +		 * will not do on this old chipset. But you can never
> +		 * be too careful, so reserve this memory anyway.
> +		 */
> +		ram at 17f00000 {
> +			reg = <0x17f00000 0x00100000>;
> +			no-map;
> +		};
> +	};
>  };
> diff --git a/arch/arm/boot/dts/ste-db9500.dtsi b/arch/arm/boot/dts/ste-db9500.dtsi
> new file mode 100644
> index 000000000000..0afff703191c
> --- /dev/null
> +++ b/arch/arm/boot/dts/ste-db9500.dtsi
> @@ -0,0 +1,35 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +#include "ste-dbx5x0.dtsi"
> +
> +/ {
> +	cpus {
> +		cpu at 300 {
> +			/* cpufreq controls */
> +			operating-points = <1152000 0
> +					    800000 0
> +					    400000 0
> +					    200000 0>;
> +		};
> +	};
> +
> +	reserved-memory {
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		ranges;
> +
> +		/*
> +		 * Initial Secure Software ISSW memory
> +		 *
> +		 * This is probably only used if the kernel tries
> +		 * to actually call into trustzone to run secure
> +		 * applications, which the mainline kernel probably
> +		 * will not do on this old chipset. But you can never
> +		 * be too careful, so reserve this memory anyway.
> +		 */
> +		ram at 17f00000 {
> +			reg = <0x17f00000 0x00100000>;
> +			no-map;
> +		};
> +	};
> +};
> diff --git a/arch/arm/boot/dts/ste-snowball.dts b/arch/arm/boot/dts/ste-snowball.dts
> index be90e73c923e..27d8a07718a0 100644
> --- a/arch/arm/boot/dts/ste-snowball.dts
> +++ b/arch/arm/boot/dts/ste-snowball.dts
> @@ -4,7 +4,7 @@
>   */
>  
>  /dts-v1/;
> -#include "ste-db8500.dtsi"
> +#include "ste-db9500.dtsi"
>  #include "ste-href-ab8500.dtsi"
>  #include "ste-href-family-pinctrl.dtsi"
>  
> 


-- 
Thanks,

David / dhildenb




More information about the linux-arm-kernel mailing list