[U-Boot] [V2] [PATCH 6/8] sunxi: Add optional logic to start cluster 1 and the associated CCI-400 ports
tpearson at raptorengineering.com
tpearson at raptorengineering.com
Tue May 17 21:36:53 CEST 2016
Multi-cluster systems require that the CCI be set up if SMP is desired via
PSCI later in the boot process. Start cluster 1 and set up the CCI if
requested by the SoC configuration.
Signed-off-by: Timothy Pearson <tpearson at raptorengineering.com>
---
arch/arm/include/asm/arch-sunxi/prcm.h | 3 ++-
board/sunxi/board.c | 45 ++++++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/arch/arm/include/asm/arch-sunxi/prcm.h b/arch/arm/include/asm/arch-sunxi/prcm.h
index 556c1af..9e8a367 100644
--- a/arch/arm/include/asm/arch-sunxi/prcm.h
+++ b/arch/arm/include/asm/arch-sunxi/prcm.h
@@ -219,7 +219,8 @@ struct sunxi_prcm_reg {
u32 clk_outd; /* 0x0f0 */
u8 res6[0xc]; /* 0x0f4 */
u32 cpu_pwroff; /* 0x100 */
- u8 res7[0xc]; /* 0x104 */
+ u32 cluster1_cpu_pwr; /* 0x104 */
+ u8 res7[0x8]; /* 0x108 */
u32 vdd_sys_pwroff; /* 0x110 */
u8 res8[0x4]; /* 0x114 */
u32 gpu_pwroff; /* 0x118 */
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index 3cf3614..0d2bd2c 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -20,6 +20,7 @@
#include <asm/arch/dram.h>
#include <asm/arch/gpio.h>
#include <asm/arch/mmc.h>
+#include <asm/arch/prcm.h>
#include <asm/arch/usb_phy.h>
#ifndef CONFIG_ARM64
#include <asm/armv7.h>
@@ -30,6 +31,18 @@
#include <net.h>
#include <sy8106a.h>
+/* CCI-400 registers */
+struct cci400_control {
+ uint32_t unused0[0x3];
+ uint32_t status;
+ uint32_t unused1[0xffc];
+ uint32_t snoop_ctrl_a7;
+ uint32_t sha_ord_a7;
+ uint32_t unused2[0x3fe];
+ uint32_t snoop_ctrl_a15;
+ uint32_t sha_ord_a15;
+};
+
#if defined CONFIG_VIDEO_LCD_PANEL_I2C && !(defined CONFIG_SPL_BUILD)
/* So that we can use pin names in Kconfig and sunxi_name_to_gpio() */
int soft_i2c_gpio_sda;
@@ -122,6 +135,38 @@ int board_init(void)
gpio_direction_output(CONFIG_MACPWR, 1);
#endif
+#ifdef CONFIG_ENABLE_CLUSTER_1
+ struct sunxi_prcm_reg *prcm =
+ (struct sunxi_prcm_reg *)SUNXI_PRCM_BASE;
+ clrbits_le32(&prcm->cluster1_cpu_pwr, 0x1);
+#endif
+
+#ifdef CONFIG_ENABLE_CCI400_SNOOP_CLUSTERS_0_1
+ printf("Enabling snoop controls...");
+ struct cci400_control *cci = (struct cci400_control *)SUN8I_CCI400_BASE;
+ uint32_t snoop_ctl;
+
+ /* Set up cluster 0 CCI port */
+ snoop_ctl = readl(&cci->snoop_ctrl_a7);
+ snoop_ctl |= CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN;
+ writel(snoop_ctl, &cci->snoop_ctrl_a7);
+
+ /* Wait for snoop control change to take effect */
+ while (readl(&cci->status) & 0x1);
+
+ /* Set up cluster 1 CCI port */
+ snoop_ctl = readl(&cci->snoop_ctrl_a15);
+ snoop_ctl |= CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN;
+ writel(snoop_ctl, &cci->snoop_ctrl_a15);
+
+ /* Wait for snoop control change to take effect */
+ while (readl(&cci->status) & 0x1);
+
+ /* Synchronize CCI enable */
+ __asm__ volatile ("dsb\n");
+ printf("done!\n");
+#endif
+
/* Uses dm gpio code so do this here and not in i2c_init_board() */
return soft_i2c_board_init();
}
--
2.8.0.rc3
More information about the U-Boot
mailing list