On 1/3/21 3:26 AM, Jernej Skrabec wrote: > H616 is very similar to H6 so most of the infrastructure can be reused. > However, two big differences are that it doesn't have functional SRAM A2 > which is usually used for TF-A and it doesn't have ARISC co-processor. > It also needs bigger SPL size - 48 KiB. > > Signed-off-by: Jernej Skrabec <jernej.skra...@siol.net> > --- > arch/arm/dts/sunxi-u-boot.dtsi | 9 +++++++++ > arch/arm/include/asm/arch-sunxi/cpu_sun50i_h6.h | 7 +++++++ > arch/arm/mach-sunxi/Kconfig | 11 ++++++++++- > arch/arm/mach-sunxi/cpu_info.c | 2 ++ > drivers/power/Kconfig | 1 + > include/configs/sunxi-common.h | 10 ++++++++++ > 6 files changed, 39 insertions(+), 1 deletion(-) > > diff --git a/arch/arm/dts/sunxi-u-boot.dtsi b/arch/arm/dts/sunxi-u-boot.dtsi > index c77cf7cacf0c..7e8644f390a8 100644 > --- a/arch/arm/dts/sunxi-u-boot.dtsi > +++ b/arch/arm/dts/sunxi-u-boot.dtsi > @@ -3,6 +3,9 @@ > #ifdef CONFIG_MACH_SUN50I_H6 > #define BL31_ADDR 0x104000 > #define SCP_ADDR 0x114000 > +#elif defined(CONFIG_MACH_SUN50I_H616) > +#define BL31_ADDR 0x40004000 > +#define SCP_ADDR 0x028000
There should be no SCP_ADDR if there is no SCP firmware. > #else > #define BL31_ADDR 0x44000 > #define SCP_ADDR 0x50000 > @@ -61,6 +64,7 @@ > }; > }; > > +#ifndef CONFIG_MACH_SUN50I_H616 > scp { > description = "SCP firmware"; > type = "firmware"; > @@ -73,6 +77,7 @@ > missing-msg = "scp-sunxi"; > }; > }; > +#endif > > @fdt-SEQ { > description = "NAME"; > @@ -87,7 +92,11 @@ > @config-SEQ { > description = "NAME"; > firmware = "atf"; > +#ifdef CONFIG_MACH_SUN50I_H616 > + loadables = "uboot"; > +#else > loadables = "scp", "uboot"; > +#endif > fdt = "fdt-SEQ"; > }; > }; > diff --git a/arch/arm/include/asm/arch-sunxi/cpu_sun50i_h6.h > b/arch/arm/include/asm/arch-sunxi/cpu_sun50i_h6.h > index 6392cb07b472..d9cf8ae04288 100644 > --- a/arch/arm/include/asm/arch-sunxi/cpu_sun50i_h6.h > +++ b/arch/arm/include/asm/arch-sunxi/cpu_sun50i_h6.h > @@ -28,13 +28,20 @@ > #define SUNXI_GIC400_BASE 0x03020000 > #define SUNXI_IOMMU_BASE 0x030F0000 > > +#ifdef CONFIG_MACH_SUN50I_H6 > #define SUNXI_DRAM_COM_BASE 0x04002000 > #define SUNXI_DRAM_CTL0_BASE 0x04003000 > #define SUNXI_DRAM_PHY0_BASE 0x04005000 > +#endif > #define SUNXI_NFC_BASE 0x04011000 > #define SUNXI_MMC0_BASE 0x04020000 > #define SUNXI_MMC1_BASE 0x04021000 > #define SUNXI_MMC2_BASE 0x04022000 > +#ifdef CONFIG_MACH_SUN50I_H616 > +#define SUNXI_DRAM_COM_BASE 0x047FA000 > +#define SUNXI_DRAM_CTL0_BASE 0x047FB000 > +#define SUNXI_DRAM_PHY0_BASE 0x04800000 > +#endif > > #define SUNXI_UART0_BASE 0x05000000 > #define SUNXI_UART1_BASE 0x05000400 > diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig > index 1a5497989f04..859b30d74ceb 100644 > --- a/arch/arm/mach-sunxi/Kconfig > +++ b/arch/arm/mach-sunxi/Kconfig > @@ -190,9 +190,10 @@ config MACH_SUNXI_H3_H5 > select SUPPORT_SPL > > # TODO: try out A80's 8GiB DRAM space > +# TODO: H616 supports 4 GiB DRAM space > config SUNXI_DRAM_MAX_SIZE > hex > - default 0xC0000000 if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN50I_H6 > + default 0xC0000000 if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN50I_H6 > || MACH_SUN50I_H616 > default 0x80000000 > > choice > @@ -354,6 +355,12 @@ config MACH_SUN50I_H6 > select PHY_SUN4I_USB > select DRAM_SUN50I_H6 > > +config MACH_SUN50I_H616 > + bool "sun50i (Allwinner H616)" > + select ARM64 > + select DRAM_SUN50I_H616 > + select SUN50I_GEN_H6 > + > endchoice > > # The sun8i SoCs share a lot, this helps to avoid a lot of "if A23 || A33" > @@ -589,6 +596,7 @@ config SYS_CLK_FREQ > default 816000000 if MACH_SUN50I || MACH_SUN50I_H5 > default 1008000000 if MACH_SUN8I > default 1008000000 if MACH_SUN9I > + default 1008000000 if MACH_SUN50I_H616 > > config SYS_CONFIG_NAME > default "sun4i" if MACH_SUN4I > @@ -599,6 +607,7 @@ config SYS_CONFIG_NAME > default "sun9i" if MACH_SUN9I > default "sun50i" if MACH_SUN50I > default "sun50i" if MACH_SUN50I_H6 > + default "sun50i" if MACH_SUN50I_H616 > > config SYS_BOARD > default "sunxi" > diff --git a/arch/arm/mach-sunxi/cpu_info.c b/arch/arm/mach-sunxi/cpu_info.c > index 875e5a1a8a8e..ba33ef24300c 100644 > --- a/arch/arm/mach-sunxi/cpu_info.c > +++ b/arch/arm/mach-sunxi/cpu_info.c > @@ -99,6 +99,8 @@ int print_cpuinfo(void) > puts("CPU: Allwinner H5 (SUN50I)\n"); > #elif defined CONFIG_MACH_SUN50I_H6 > puts("CPU: Allwinner H6 (SUN50I)\n"); > +#elif defined CONFIG_MACH_SUN50I_H616 > + puts("CPU: Allwinner H616 (SUN50I)\n"); > #else > #warning Please update cpu_info.c with correct CPU information > puts("CPU: SUNXI Family\n"); > diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig > index d17cf2d9112a..c5fbf1f832a9 100644 > --- a/drivers/power/Kconfig > +++ b/drivers/power/Kconfig > @@ -13,6 +13,7 @@ choice > depends on ARCH_SUNXI > default AXP209_POWER if MACH_SUN4I || MACH_SUN5I || MACH_SUN7I > default AXP221_POWER if MACH_SUN6I || MACH_SUN8I_A23 || MACH_SUN8I_A33 > || MACH_SUN8I_R40 > + default AXP305_POWER if MACH_SUN50I_H616 > default AXP818_POWER if MACH_SUN8I_A83T > default SUNXI_NO_PMIC if MACH_SUNXI_H3_H5 || MACH_SUN50I || > MACH_SUN8I_V3S > > diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h > index 203cb10fbabc..6e8f547214d6 100644 > --- a/include/configs/sunxi-common.h > +++ b/include/configs/sunxi-common.h > @@ -178,9 +178,14 @@ > #define LOW_LEVEL_SRAM_STACK 0x00018000 > #endif /* !CONFIG_ARM64 */ > #elif CONFIG_SUNXI_SRAM_ADDRESS == 0x20000 > +#ifdef CONFIG_MACH_SUN50I_H616 > +#define CONFIG_SPL_MAX_SIZE 0xbfa0 /* 48 KiB */ > +#define LOW_LEVEL_SRAM_STACK 0x58000 > +#else > #define CONFIG_SPL_MAX_SIZE 0x7fa0 /* 32 KiB */ > /* end of SRAM A2 on H6 for now */ > #define LOW_LEVEL_SRAM_STACK 0x00118000 > +#endif > #else > #define CONFIG_SPL_MAX_SIZE 0x5fa0 /* 24KB on sun4i/sun7i > */ > #define LOW_LEVEL_SRAM_STACK 0x00008000 /* End of sram */ > @@ -188,7 +193,12 @@ > > #define CONFIG_SPL_STACK LOW_LEVEL_SRAM_STACK > > +/* H616 supports 48 KiB SPL */ > +#ifdef CONFIG_MACH_SUN50I_H616 > +#define CONFIG_SPL_PAD_TO 49152 /* decimal for 'dd' */ H616 supports much larger SPLs than 48 KiB, and CONFIG_SPL_PAD_TO enforces both a minimum and maximum size. So please leave CONFIG_SPL_PAD_TO undefined on the new platform (or for all SUN50I_GEN_H6, where the SPL size restriction was removed). > +#else > #define CONFIG_SPL_PAD_TO 32768 /* decimal for 'dd' */ > +#endif > > > /* I2C */ > Cheers, Samuel