diff options
author | Christine Gharzuzi <chrisg@marvell.com> | 2018-06-25 13:39:37 +0300 |
---|---|---|
committer | Konstantin Porotchkin <kostap@marvell.com> | 2018-12-04 14:09:44 +0200 |
commit | 1020e0d3264887fb642b02d47d1d1dcb4783fdba (patch) | |
tree | 59f2ebbdc87de8edda4bb66738b1ef66dcea3cc1 /plat/marvell | |
parent | 55df84f974ea37abbb4f93f000f101f70cda5303 (diff) |
ble: ap807: Switch to PLL mode and update CPU frequency
- Update CPU frequency on AP807 to 2GHz for SAR 0x0.
- Increase AVS to 0.88V for 2GHz clock
Change-Id: Ic945b682ab2f8543e34294bfc56c3eae2c5e0c8e
Signed-off-by: Christine Gharzuzi <chrisg@marvell.com>
Signed-off-by: Konstantin Porotchkin <kostap@marvell.com>
Diffstat (limited to 'plat/marvell')
-rw-r--r-- | plat/marvell/a8k/common/a8k_common.mk | 17 | ||||
-rw-r--r-- | plat/marvell/a8k/common/plat_ble_setup.c | 118 |
2 files changed, 60 insertions, 75 deletions
diff --git a/plat/marvell/a8k/common/a8k_common.mk b/plat/marvell/a8k/common/a8k_common.mk index 6136a1f5..6b2b3535 100644 --- a/plat/marvell/a8k/common/a8k_common.mk +++ b/plat/marvell/a8k/common/a8k_common.mk @@ -60,14 +60,15 @@ BLE_PORTING_SOURCES := $(PLAT_FAMILY_BASE)/$(PLAT)/board/dram_port.c \ MARVELL_MOCHI_DRV += $(MARVELL_DRV_BASE)/mochi/cp110_setup.c -BLE_SOURCES := drivers/mentor/i2c/mi2cv.c \ - $(PLAT_COMMON_BASE)/plat_ble_setup.c \ - $(MARVELL_MOCHI_DRV) \ - $(PLAT_COMMON_BASE)/plat_pm.c \ - $(MARVELL_DRV_BASE)/thermal.c \ - $(PLAT_COMMON_BASE)/plat_thermal.c \ - $(BLE_PORTING_SOURCES) \ - $(MARVELL_DRV_BASE)/ccu.c \ +BLE_SOURCES := drivers/mentor/i2c/mi2cv.c \ + $(PLAT_COMMON_BASE)/plat_ble_setup.c \ + $(MARVELL_MOCHI_DRV) \ + $(PLAT_COMMON_BASE)/plat_pm.c \ + $(MARVELL_DRV_BASE)/ap807_clocks_init.c \ + $(MARVELL_DRV_BASE)/thermal.c \ + $(PLAT_COMMON_BASE)/plat_thermal.c \ + $(BLE_PORTING_SOURCES) \ + $(MARVELL_DRV_BASE)/ccu.c \ $(MARVELL_DRV_BASE)/io_win.c BL1_SOURCES += $(PLAT_COMMON_BASE)/aarch64/plat_helpers.S \ diff --git a/plat/marvell/a8k/common/plat_ble_setup.c b/plat/marvell/a8k/common/plat_ble_setup.c index 7438f69c..07d6cad9 100644 --- a/plat/marvell/a8k/common/plat_ble_setup.c +++ b/plat/marvell/a8k/common/plat_ble_setup.c @@ -15,14 +15,15 @@ #include <mv_ddr_if.h> #include <mvebu_def.h> #include <plat_marvell.h> +#include "ap807_clocks_init.h" /* Register for skip image use */ #define SCRATCH_PAD_REG2 0xF06F00A8 #define SCRATCH_PAD_SKIP_VAL 0x01 #define NUM_OF_GPIO_PER_REG 32 -#define MMAP_SAVE_AND_CONFIG 0 -#define MMAP_RESTORE_SAVED 1 +#define MMAP_SAVE_AND_CONFIG 0 +#define MMAP_RESTORE_SAVED 1 /* SAR clock settings */ #define MVEBU_AP_GEN_MGMT_BASE (MVEBU_RFU_BASE + 0x8000) @@ -77,22 +78,17 @@ (0x2c2 << 3) | \ (0x1 << AVS_SOFT_RESET_OFFSET) | \ (0x1 << AVS_ENABLE_OFFSET)) +/* VDD is 0.88V for 2GHz clock */ +#define AVS_A3900_HIGH_CLK_VALUE ((0x80 << 24) | \ + (0x2f5 << 13) | \ + (0x2f5 << 3) | \ + (0x1 << AVS_SOFT_RESET_OFFSET) | \ + (0x1 << AVS_ENABLE_OFFSET)) #define MVEBU_AP_EFUSE_SRV_CTRL_REG (MVEBU_AP_GEN_MGMT_BASE + 0x8) #define EFUSE_SRV_CTRL_LD_SELECT_OFFS 6 #define EFUSE_SRV_CTRL_LD_SEL_USER_MASK (1 << EFUSE_SRV_CTRL_LD_SELECT_OFFS) -/* Notify bootloader on DRAM setup */ -#define AP807_CPU_ARO_0_CTRL_0 (MVEBU_RFU_BASE + 0x82A8) -#define AP807_CPU_ARO_1_CTRL_0 (MVEBU_RFU_BASE + 0x8D00) - -/* 0 - ARO clock is enabled, 1 - ARO clock is disabled */ -#define AP807_CPU_ARO_CLK_EN_OFFSET 0 -#define AP807_CPU_ARO_CLK_EN_MASK (0x1 << AP807_CPU_ARO_CLK_EN_OFFSET) - -/* 0 - ARO is the clock source, 1 - PLL is the clock source */ -#define AP807_CPU_ARO_SEL_PLL_OFFSET 5 -#define AP807_CPU_ARO_SEL_PLL_MASK (0x1 << AP807_CPU_ARO_SEL_PLL_OFFSET) /* * - Identification information in the LD-0 eFuse: @@ -143,9 +139,9 @@ #define EFUSE_AP_LD0_WP_MASK 0x3FF #endif -#define EFUSE_AP_LD0_SVC4_OFFS 42 /* LD0[112:105] */ +#define EFUSE_AP_LD0_SVC4_OFFS 42 /* LD0[112:105] */ -#define EFUSE_AP_LD0_CLUSTER_DOWN_OFFS 4 +#define EFUSE_AP_LD0_CLUSTER_DOWN_OFFS 4 /* Return the AP revision of the chip */ static unsigned int ble_get_ap_type(void) @@ -207,37 +203,44 @@ static void ble_plat_mmap_config(int restore) */ static void ble_plat_avs_config(void) { - uint32_t reg_val, device_id; + uint32_t freq_mode, device_id; + uint32_t avs_val = 0; + freq_mode = + SAR_CLOCK_FREQ_MODE(mmio_read_32(MVEBU_AP_SAR_REG_BASE( + FREQ_MODE_AP_SAR_REG_NUM))); /* Check which SoC is running and act accordingly */ if (ble_get_ap_type() == CHIP_ID_AP807) { - VERBOSE("AVS: Setting AP807 AVS CTRL to 0x%x\n", - AVS_A3900_CLK_VALUE); - mmio_write_32(AVS_EN_CTRL_REG, AVS_A3900_CLK_VALUE); - return; + /* Increase CPU voltage for higher CPU clock */ + if (freq_mode == CPU_2000_DDR_1200_RCLK_1200) + avs_val = AVS_A3900_HIGH_CLK_VALUE; + else + avs_val = AVS_A3900_CLK_VALUE; + } else { + /* Check which SoC is running and act accordingly */ + device_id = cp110_device_id_get(MVEBU_CP_REGS_BASE(0)); + switch (device_id) { + case MVEBU_80X0_DEV_ID: + case MVEBU_80X0_CP115_DEV_ID: + /* Always fix the default AVS value on A80x0 */ + avs_val = AVS_A8K_CLK_VALUE; + break; + case MVEBU_70X0_DEV_ID: + case MVEBU_70X0_CP115_DEV_ID: + /* Fix AVS for CPU clocks lower than 1600MHz on A70x0 */ + if ((freq_mode > CPU_1600_DDR_900_RCLK_900_2) && + (freq_mode < CPU_DDR_RCLK_INVALID)) + avs_val = AVS_A7K_LOW_CLK_VALUE; + break; + default: + ERROR("Unsupported Device ID 0x%x\n", device_id); + return; + } } - /* Check which SoC is running and act accordingly */ - device_id = cp110_device_id_get(MVEBU_CP_REGS_BASE(0)); - switch (device_id) { - case MVEBU_80X0_DEV_ID: - case MVEBU_80X0_CP115_DEV_ID: - /* Set the new AVS value - fix the default one on A80x0 */ - mmio_write_32(AVS_EN_CTRL_REG, AVS_A8K_CLK_VALUE); - break; - case MVEBU_70X0_DEV_ID: - case MVEBU_70X0_CP115_DEV_ID: - /* Only fix AVS for CPU clocks lower than 1600MHz on A70x0 */ - reg_val = mmio_read_32(MVEBU_AP_SAR_REG_BASE( - FREQ_MODE_AP_SAR_REG_NUM)); - reg_val &= SAR_CLOCK_FREQ_MODE_MASK; - reg_val >>= SAR_CLOCK_FREQ_MODE_OFFSET; - if ((reg_val > CPU_1600_DDR_900_RCLK_900_2) && - (reg_val < CPU_DDR_RCLK_INVALID)) - mmio_write_32(AVS_EN_CTRL_REG, AVS_A7K_LOW_CLK_VALUE); - break; - default: - ERROR("Unsupported Device ID 0x%x\n", device_id); + if (avs_val) { + VERBOSE("AVS: Setting AVS CTRL to 0x%x\n", avs_val); + mmio_write_32(AVS_EN_CTRL_REG, avs_val); } } @@ -543,35 +546,11 @@ static int ble_skip_current_image(void) } #endif -/* Switch to ARO from PLL in ap807 */ -static void aro_to_pll(void) -{ - unsigned int reg; - - /* switch from ARO to PLL */ - reg = mmio_read_32(AP807_CPU_ARO_0_CTRL_0); - reg |= AP807_CPU_ARO_SEL_PLL_MASK; - mmio_write_32(AP807_CPU_ARO_0_CTRL_0, reg); - - reg = mmio_read_32(AP807_CPU_ARO_1_CTRL_0); - reg |= AP807_CPU_ARO_SEL_PLL_MASK; - mmio_write_32(AP807_CPU_ARO_1_CTRL_0, reg); - - mdelay(1000); - - /* disable ARO clk driver */ - reg = mmio_read_32(AP807_CPU_ARO_0_CTRL_0); - reg |= (AP807_CPU_ARO_CLK_EN_MASK); - mmio_write_32(AP807_CPU_ARO_0_CTRL_0, reg); - - reg = mmio_read_32(AP807_CPU_ARO_1_CTRL_0); - reg |= (AP807_CPU_ARO_CLK_EN_MASK); - mmio_write_32(AP807_CPU_ARO_1_CTRL_0, reg); -} int ble_plat_setup(int *skip) { int ret; + unsigned int freq_mode; /* Power down unused CPUs */ plat_marvell_early_cpu_powerdown(); @@ -598,9 +577,14 @@ int ble_plat_setup(int *skip) /* Setup AVS */ ble_plat_svc_config(); + /* read clk option from sampled-at-reset register */ + freq_mode = + SAR_CLOCK_FREQ_MODE(mmio_read_32(MVEBU_AP_SAR_REG_BASE( + FREQ_MODE_AP_SAR_REG_NUM))); + /* work with PLL clock driver in AP807 */ if (ble_get_ap_type() == CHIP_ID_AP807) - aro_to_pll(); + ap807_clocks_init(freq_mode); /* Do required AP setups for BLE stage */ ap_ble_init(); |