sunxi: Add support for H616 SoC
authorJernej Skrabec <jernej.skrabec@siol.net>
Mon, 11 Jan 2021 20:11:46 +0000 (21:11 +0100)
committerAndre Przywara <andre.przywara@arm.com>
Mon, 25 Jan 2021 21:52:01 +0000 (21:52 +0000)
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.skrabec@siol.net>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
arch/arm/dts/sunxi-u-boot.dtsi
arch/arm/include/asm/arch-sunxi/cpu_sun50i_h6.h
arch/arm/mach-sunxi/Kconfig
arch/arm/mach-sunxi/cpu_info.c
drivers/power/Kconfig
include/configs/sunxi-common.h

index c77cf7cacf0c7363b05a5c8554c76040ed566d07..abe629c55e57ba4d4d65288b4c2ae6a9f2b16c5e 100644 (file)
@@ -3,6 +3,8 @@
 #ifdef CONFIG_MACH_SUN50I_H6
 #define BL31_ADDR 0x104000
 #define  SCP_ADDR 0x114000
+#elif defined(CONFIG_MACH_SUN50I_H616)
+#define BL31_ADDR 0x40004000
 #else
 #define BL31_ADDR  0x44000
 #define  SCP_ADDR  0x50000
@@ -61,6 +63,7 @@
                                        };
                                };
 
+#ifndef CONFIG_MACH_SUN50I_H616
                                scp {
                                        description = "SCP firmware";
                                        type = "firmware";
@@ -73,6 +76,7 @@
                                                missing-msg = "scp-sunxi";
                                        };
                                };
+#endif
 
                                @fdt-SEQ {
                                        description = "NAME";
                                @config-SEQ {
                                        description = "NAME";
                                        firmware = "atf";
+#ifdef CONFIG_MACH_SUN50I_H616
+                                       loadables = "uboot";
+#else
                                        loadables = "scp", "uboot";
+#endif
                                        fdt = "fdt-SEQ";
                                };
                        };
index 6392cb07b472247057d264eff854148cd360a52c..d9cf8ae042883990a6e07c502c59b105f7fa2c09 100644 (file)
 #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
index d9924f99db02e93a3f1f300ff523a6bbf38b2929..0135575ca1ebbde0c0d70b953f97f6a85454c17b 100644 (file)
@@ -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
@@ -355,6 +356,12 @@ config MACH_SUN50I_H6
        select DRAM_SUN50I_H6
        select SUN50I_GEN_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"
@@ -591,6 +598,7 @@ config SYS_CLK_FREQ
        default 1008000000 if MACH_SUN8I
        default 1008000000 if MACH_SUN9I
        default 888000000 if MACH_SUN50I_H6
+       default 1008000000 if MACH_SUN50I_H616
 
 config SYS_CONFIG_NAME
        default "sun4i" if MACH_SUN4I
@@ -601,6 +609,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"
index 875e5a1a8a8e307cbeadaddb9a514cc68caddeee..ba33ef24300c01fa5ae550181b345ef4b42c9bbe 100644 (file)
@@ -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");
index d17cf2d9112a4e251f91055c9e4e919dc8ec2835..c5fbf1f832a90219a02be2f83db82a19a1c9e342 100644 (file)
@@ -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
 
index 203cb10fbabcf74c8eb579ffbc370743053817df..000f3864702021d9e79d5eafba8ab34d63c882ca 100644 (file)
 #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 */
 
 #define CONFIG_SPL_STACK               LOW_LEVEL_SRAM_STACK
 
+#ifndef CONFIG_MACH_SUN50I_H616
 #define CONFIG_SPL_PAD_TO              32768           /* decimal for 'dd' */
+#endif
 
 
 /* I2C */