[RFC PATCH 06/10] arm64: dts: apple: Add initial t6000/t6001/t6002 DTs

Janne Grunau j at jannau.net
Wed Sep 14 04:04:49 PDT 2022


On 2022-09-13 08:32:07 -0500, Rob Herring wrote:
> On Fri, Sep 09, 2022 at 03:50:59PM +0200, Janne Grunau wrote:
> > From: Hector Martin <marcan at marcan.st>
> > 
> > These SoCs are found in Apple devices with M1 Pro (t6000), M1 Max
> > (t6001) and M1 Ultra (t6002).
> > 
> > t6000 is a cut-down version of t6001, so the former just includes the
> > latter and disables the missing bits (This is currently just one PMGR
> > node and all of its domains.
> > 
> > t6002 is two connected t6001 dies. The implementation seems to use
> > t6001 with blocks disabled (mostly on the second die). MMIO addresses on
> > the second die have a constant offset. The interrupt controller is
> > multi-die aware. This setup can be represented in the device tree with
> > two top level "soc" nodes. The MMIO offset is applied via "ranges" and
> > devices are included with preproceesor macros to make the node labels
> > unique and to specify the die number for the interrupt definition.
> > 
> > Device nodes are distributed over dtsi files based on whether they are
> > present on both dies or just on the first die. The only execption is the
> > NVMe controller which resides on the second die. Its nodes are in a
> > separate file.
> > 
> > Signed-off-by: Hector Martin <marcan at marcan.st>
> > Co-developed-by: Janne Grunau <j at jannau.net>
> > Signed-off-by: Janne Grunau <j at jannau.net>
> > 
> > ---
> > 
> > 
> > ---
> >  arch/arm64/boot/dts/apple/multi-die-cpp.h     |   23 +
> >  arch/arm64/boot/dts/apple/t6000.dtsi          |   18 +
> >  arch/arm64/boot/dts/apple/t6001.dtsi          |   63 +
> >  arch/arm64/boot/dts/apple/t6002.dtsi          |  173 ++
> >  arch/arm64/boot/dts/apple/t600x-common.dtsi   |  128 ++
> >  arch/arm64/boot/dts/apple/t600x-die0.dtsi     |  298 +++
> >  arch/arm64/boot/dts/apple/t600x-dieX.dtsi     |  103 +
> >  .../arm64/boot/dts/apple/t600x-gpio-pins.dtsi |   45 +
> >  arch/arm64/boot/dts/apple/t600x-nvme.dtsi     |   42 +
> >  arch/arm64/boot/dts/apple/t600x-pmgr.dtsi     | 2012 +++++++++++++++++
> >  10 files changed, 2905 insertions(+)
> >  create mode 100644 arch/arm64/boot/dts/apple/multi-die-cpp.h
> >  create mode 100644 arch/arm64/boot/dts/apple/t6000.dtsi
> >  create mode 100644 arch/arm64/boot/dts/apple/t6001.dtsi
> >  create mode 100644 arch/arm64/boot/dts/apple/t6002.dtsi
> >  create mode 100644 arch/arm64/boot/dts/apple/t600x-common.dtsi
> >  create mode 100644 arch/arm64/boot/dts/apple/t600x-die0.dtsi
> >  create mode 100644 arch/arm64/boot/dts/apple/t600x-dieX.dtsi
> >  create mode 100644 arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi
> >  create mode 100644 arch/arm64/boot/dts/apple/t600x-nvme.dtsi
> >  create mode 100644 arch/arm64/boot/dts/apple/t600x-pmgr.dtsi
> > 
> > diff --git a/arch/arm64/boot/dts/apple/multi-die-cpp.h b/arch/arm64/boot/dts/apple/multi-die-cpp.h
> > new file mode 100644
> > index 000000000000..153d89dd0ae1
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/apple/multi-die-cpp.h
> > @@ -0,0 +1,23 @@
> > +/* SPDX-License-Identifier: GPL-2.0+ OR MIT
> > + *
> > + * C preprocessor macros for t600x multi die support.
> > + */
> > +
> > +#ifndef __DTS_APPLE_MULTI_DIE_CPP_H
> > +#define __DTS_APPLE_MULTI_DIE_CPP_H
> > +
> > +#ifndef __stringify
> > +/* copied from include/linux/stringify.h */
> 
> Which is dual licensed? Arguably, not big enough to matter.

include/linux/stringify.h has no license header at all. If that's 
acceptable I will drop it from this file as well.
I started from scratch with the SPDX header from other apple dts files.  
I should have paid more attention after replacing it with kernel 
__stringify (I probably would have updated it if stringify.h had a SPDX 
header). 

> > +#define __stringify_1(x...)     #x
> > +#define __stringify(x...)       __stringify_1(x)
> > +#endif
> > +
> > +#ifndef __concat
> > +#define __concat_1(x, y...)     x ## y
> > +#define __concat(x, y...)       __concat_1(x, y)
> > +#endif
> > +
> > +#define DIE_NODE(a) __concat(a, DIE)
> > +#define DIE_LABEL(a) __stringify(__concat(a, DIE))
> 
> Not a pattern we encourage in DT, but seems necessary here.

That is probably an arguments for keeping __concat/__stringify local 
instead of adding it to include/dt-bindings 

> > +
> > +#endif /* !__LINUX_STRINGIFY_H */
> > diff --git a/arch/arm64/boot/dts/apple/t6000.dtsi b/arch/arm64/boot/dts/apple/t6000.dtsi
> > new file mode 100644
> > index 000000000000..89c3b211b116
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/apple/t6000.dtsi
> > @@ -0,0 +1,18 @@
> > +// SPDX-License-Identifier: GPL-2.0+ OR MIT
> > +/*
> > + * Apple T6000 "M1 Pro" SoC
> > + *
> > + * Other names: H13J, "Jade Chop"
> > + *
> > + * Copyright The Asahi Linux Contributors
> > + */
> > +
> > +/* This chip is just a cut down version of t6001, so include it and disable the missing parts */
> > +
> > +#include "t6001.dtsi"
> > +
> > +/ {
> > +	compatible = "apple,t6000", "apple,arm-platform";
> > +};
> > +
> > +/delete-node/ &pmgr_south;
> > diff --git a/arch/arm64/boot/dts/apple/t6001.dtsi b/arch/arm64/boot/dts/apple/t6001.dtsi
> > new file mode 100644
> > index 000000000000..620b17e4031f
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/apple/t6001.dtsi
> > @@ -0,0 +1,63 @@
> > +// SPDX-License-Identifier: GPL-2.0+ OR MIT
> > +/*
> > + * Apple T6001 "M1 Max" SoC
> > + *
> > + * Other names: H13J, "Jade"
> > + *
> > + * Copyright The Asahi Linux Contributors
> > + */
> > +
> > +#include <dt-bindings/gpio/gpio.h>
> > +#include <dt-bindings/interrupt-controller/apple-aic.h>
> > +#include <dt-bindings/interrupt-controller/irq.h>
> > +#include <dt-bindings/pinctrl/apple.h>
> > +
> > +#include "multi-die-cpp.h"
> > +
> > +#include "t600x-common.dtsi"
> > +
> > +/ {
> > +	compatible = "apple,t6001", "apple,arm-platform";
> > +
> > +	soc {
> > +		compatible = "simple-bus";
> > +		#address-cells = <2>;
> > +		#size-cells = <2>;
> > +
> > +		ranges;
> > +		nonposted-mmio;
> > +
> > +		// filled via templated includes at the end of the file
> > +	};
> > +};
> > +
> > +#define DIE
> > +#define DIE_NO 0
> > +
> > +&{/soc} {
> > +	#include "t600x-die0.dtsi"
> > +	#include "t600x-dieX.dtsi"
> > +	#include "t600x-nvme.dtsi"
> > +};
> > +
> > +#include "t600x-gpio-pins.dtsi"
> > +#include "t600x-pmgr.dtsi"
> > +
> > +#undef DIE
> > +#undef DIE_NO
> > +
> > +
> > +&aic {
> > +	affinities {
> > +		e-core-pmu-affinity {
> > +			apple,fiq-index = <AIC_CPU_PMU_E>;
> > +			cpus = <&cpu_e00 &cpu_e01>;
> > +		};
> > +
> > +		p-core-pmu-affinity {
> > +			apple,fiq-index = <AIC_CPU_PMU_P>;
> > +			cpus = <&cpu_p00 &cpu_p01 &cpu_p02 &cpu_p03
> > +				&cpu_p10 &cpu_p11 &cpu_p12 &cpu_p13>;
> > +		};
> > +	};
> > +};
> > diff --git a/arch/arm64/boot/dts/apple/t6002.dtsi b/arch/arm64/boot/dts/apple/t6002.dtsi
> > new file mode 100644
> > index 000000000000..32c971c0e191
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/apple/t6002.dtsi
> > @@ -0,0 +1,173 @@
> > +// SPDX-License-Identifier: GPL-2.0+ OR MIT
> > +/*
> > + * Apple T6002 "M1 Ultra" SoC
> > + *
> > + * Other names: H13J, "Jade 2C"
> > + *
> > + * Copyright The Asahi Linux Contributors
> > + */
> > +
> > +#include <dt-bindings/gpio/gpio.h>
> > +#include <dt-bindings/interrupt-controller/apple-aic.h>
> > +#include <dt-bindings/interrupt-controller/irq.h>
> > +#include <dt-bindings/pinctrl/apple.h>
> > +
> > +#include "multi-die-cpp.h"
> > +
> > +#include "t600x-common.dtsi"
> > +
> > +/ {
> > +	compatible = "apple,t6002", "apple,arm-platform";
> > +
> > +	#address-cells = <2>;
> > +	#size-cells = <2>;
> > +
> > +	cpus {
> > +		cpu_e10: cpu at 800 {
> > +			compatible = "apple,icestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x800>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +
> > +		cpu_e11: cpu at 801 {
> > +			compatible = "apple,icestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x801>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +
> > +		cpu_p20: cpu at 10900 {
> > +			compatible = "apple,firestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x10900>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +
> > +		cpu_p21: cpu at 10901 {
> > +			compatible = "apple,firestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x10901>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +
> > +		cpu_p22: cpu at 10902 {
> > +			compatible = "apple,firestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x10902>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +
> > +		cpu_p23: cpu at 10903 {
> > +			compatible = "apple,firestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x10903>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +
> > +		cpu_p30: cpu at 10a00 {
> > +			compatible = "apple,firestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x10a00>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +
> > +		cpu_p31: cpu at 10a01 {
> > +			compatible = "apple,firestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x10a01>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +
> > +		cpu_p32: cpu at 10a02 {
> > +			compatible = "apple,firestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x10a02>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +
> > +		cpu_p33: cpu at 10a03 {
> > +			compatible = "apple,firestorm";
> > +			device_type = "cpu";
> > +			reg = <0x0 0x10a03>;
> > +			enable-method = "spin-table";
> > +			cpu-release-addr = <0 0>; /* To be filled by loader */
> > +		};
> > +	};
> > +
> > +	die0: soc at 0 {
> 
> Where does 0 come from? 
> 
> Unit address comes from 'reg' or 'ranges'. Empty ranges here means all 
> of the address space is part of this node which obviously is not true 
> given the next node. You need a 1:1 non-empty ranges entry.

fixed locally

> > +		compatible = "simple-bus";
> > +		#address-cells = <2>;
> > +		#size-cells = <2>;
> > +		ranges;
> > +		nonposted-mmio;
> > +
> > +		// filled via templated includes at the end of the file
> > +	};
> > +
> > +	die1: soc at 1 {
> 
> soc at 2200000000

fixed

> > +		compatible = "simple-bus";
> > +		#address-cells = <2>;
> > +		#size-cells = <2>;
> > +		ranges = <0x2 0x0 0x22 0x0 0x4 0x0>,
> > +				<0x7 0x0 0x27 0x0 0xf 0x80000000>;
> > +		nonposted-mmio;
> > +
> > +		// filled via templated includes at the end of the file
> > +	};
> > +};
> > +
> > +#define DIE
> > +#define DIE_NO 0
> > +
> > +&die0 {
> > +	#include "t600x-die0.dtsi"
> 
> Looks like this one is not templated, so it doesn't really need to be 
> here. But it's fine.

I added here to have all '#include' directives in a single place.  
t600x-gpio-pins.dtsi isn't templated either. 

> > +	#include "t600x-dieX.dtsi"
> > +};
> > +
> > +#include "t600x-pmgr.dtsi"
> > +#include "t600x-gpio-pins.dtsi"
> > +
> > +#undef DIE
> > +#undef DIE_NO
> > +
> > +#define DIE _die1
> > +#define DIE_NO 1
> > +
> > +&die1 {
> > +	#include "t600x-dieX.dtsi"
> > +	#include "t600x-nvme.dtsi"
> > +};
> > +
> > +#include "t600x-pmgr.dtsi"
> > +
> > +#undef DIE
> > +#undef DIE_NO

thanks




More information about the linux-arm-kernel mailing list