sdram: Allow killing ram clock source if desired

This commit is contained in:
CTCaer 2020-04-30 03:39:18 +03:00
parent 093f14923c
commit 1d69809022
5 changed files with 49 additions and 36 deletions

View file

@ -232,6 +232,7 @@
#define EMC_COMP_PAD_SW_CTRL 0x57c #define EMC_COMP_PAD_SW_CTRL 0x57c
#define EMC_REQ_CTRL 0x2b0 #define EMC_REQ_CTRL 0x2b0
#define EMC_EMC_STATUS 0x2b4 #define EMC_EMC_STATUS 0x2b4
#define EMC_STATUS_MRR_DIVLD (1 << 20)
#define EMC_CFG_2 0x2b8 #define EMC_CFG_2 0x2b8
#define EMC_CFG_DIG_DLL 0x2bc #define EMC_CFG_DIG_DLL 0x2bc
#define EMC_CFG_DIG_DLL_PERIOD 0x2c0 #define EMC_CFG_DIG_DLL_PERIOD 0x2c0

View file

@ -31,6 +31,8 @@
#include "../soc/t210.h" #include "../soc/t210.h"
#include "../utils/util.h" #include "../utils/util.h"
#define CONFIG_SDRAM_KEEP_ALIVE
#ifdef CONFIG_SDRAM_COMPRESS_CFG #ifdef CONFIG_SDRAM_COMPRESS_CFG
#include "../libs/compr/lz.h" #include "../libs/compr/lz.h"
#include "sdram_config_lz.inl" #include "sdram_config_lz.inl"
@ -117,10 +119,14 @@ static void _sdram_config(const sdram_params_t *params)
CLOCK(CLK_RST_CONTROLLER_PLLM_MISC1) = params->pllm_setup_control; CLOCK(CLK_RST_CONTROLLER_PLLM_MISC1) = params->pllm_setup_control;
CLOCK(CLK_RST_CONTROLLER_PLLM_MISC2) = 0; CLOCK(CLK_RST_CONTROLLER_PLLM_MISC2) = 0;
// u32 tmp = (params->pllm_feedback_divider << 8) | params->pllm_input_divider | ((params->pllm_post_divider & 0xFFFF) << 20); #ifdef CONFIG_SDRAM_KEEP_ALIVE
// CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = tmp; CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) =
// CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = tmp | 0x40000000; (params->pllm_feedback_divider << 8) | params->pllm_input_divider | ((params->pllm_post_divider & 0xFFFF) << 20) | PLLCX_BASE_ENABLE;
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = (params->pllm_feedback_divider << 8) | params->pllm_input_divider | 0x40000000 | ((params->pllm_post_divider & 0xFFFF) << 20); #else
u32 pllm_div = (params->pllm_feedback_divider << 8) | params->pllm_input_divider | ((params->pllm_post_divider & 0xFFFF) << 20);
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = pllm_div;
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = pllm_div | PLLCX_BASE_ENABLE;
#endif
u32 wait_end = get_tmr_us() + 300; u32 wait_end = get_tmr_us() + 300;
while (!(CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) & 0x8000000)) while (!(CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) & 0x8000000))
@ -553,9 +559,9 @@ break_nosleep:
// ZQ CAL setup (not actually issuing ZQ CAL now). // ZQ CAL setup (not actually issuing ZQ CAL now).
if (params->emc_zcal_warm_cold_boot_enables & 1) if (params->emc_zcal_warm_cold_boot_enables & 1)
{ {
if (params->memory_type == 2) if (params->memory_type == MEMORY_TYPE_DDR3L)
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt << 3; EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt << 3;
if (params->memory_type == 3) if (params->memory_type == MEMORY_TYPE_LPDDR4)
{ {
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt; EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt;
EMC(EMC_ZCAL_MRW_CMD) = params->emc_zcal_mrw_cmd; EMC(EMC_ZCAL_MRW_CMD) = params->emc_zcal_mrw_cmd;
@ -571,7 +577,7 @@ break_nosleep:
// Set clock enable signal. // Set clock enable signal.
u32 pin_gpio_cfg = (params->emc_pin_gpio_enable << 16) | (params->emc_pin_gpio << 12); u32 pin_gpio_cfg = (params->emc_pin_gpio_enable << 16) | (params->emc_pin_gpio << 12);
if (params->memory_type == 2 || params->memory_type == 3) if (params->memory_type == MEMORY_TYPE_DDR3L || params->memory_type == MEMORY_TYPE_LPDDR4)
{ {
EMC(EMC_PIN) = pin_gpio_cfg; EMC(EMC_PIN) = pin_gpio_cfg;
(void)EMC(EMC_PIN); (void)EMC(EMC_PIN);
@ -580,9 +586,9 @@ break_nosleep:
(void)EMC(EMC_PIN); (void)EMC(EMC_PIN);
} }
if (params->memory_type == 3) if (params->memory_type == MEMORY_TYPE_LPDDR4)
usleep(params->emc_pin_extra_wait + 2000); usleep(params->emc_pin_extra_wait + 2000);
else if (params->memory_type == 2) else if (params->memory_type == MEMORY_TYPE_DDR3L)
usleep(params->emc_pin_extra_wait + 500); usleep(params->emc_pin_extra_wait + 500);
// Enable clock enable signal. // Enable clock enable signal.
@ -591,15 +597,15 @@ break_nosleep:
usleep(params->emc_pin_program_wait); usleep(params->emc_pin_program_wait);
// Send NOP (trigger just needs to be non-zero). // Send NOP (trigger just needs to be non-zero).
if (params->memory_type != 3) if (params->memory_type != MEMORY_TYPE_LPDDR4)
EMC(EMC_NOP) = (params->emc_dev_select << 30) + 1; EMC(EMC_NOP) = (params->emc_dev_select << 30) + 1;
// On coldboot w/LPDDR2/3, wait 200 uSec after asserting CKE high. // On coldboot w/LPDDR2/3, wait 200 uSec after asserting CKE high.
if (params->memory_type == 1) if (params->memory_type == MEMORY_TYPE_LPDDR2)
usleep(params->emc_pin_extra_wait + 200); usleep(params->emc_pin_extra_wait + 200);
// Init zq calibration, // Init zq calibration,
if (params->memory_type == 3) if (params->memory_type == MEMORY_TYPE_LPDDR4)
{ {
// Patch 6 using BCT spare variables. // Patch 6 using BCT spare variables.
if (params->emc_bct_spare10) if (params->emc_bct_spare10)
@ -640,7 +646,7 @@ break_nosleep:
PMC(APBDEV_PMC_DDR_CFG) = params->pmc_ddr_cfg; PMC(APBDEV_PMC_DDR_CFG) = params->pmc_ddr_cfg;
// Start periodic ZQ calibration (LPDDRx only). // Start periodic ZQ calibration (LPDDRx only).
if (params->memory_type - 1 <= 2) if (params->memory_type && params->memory_type <= MEMORY_TYPE_LPDDR4)
{ {
EMC(EMC_ZCAL_INTERVAL) = params->emc_zcal_interval; EMC(EMC_ZCAL_INTERVAL) = params->emc_zcal_interval;
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt; EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt;

View file

@ -26,12 +26,12 @@
#ifndef _SDRAM_PARAM_T210_H_ #ifndef _SDRAM_PARAM_T210_H_
#define _SDRAM_PARAM_T210_H_ #define _SDRAM_PARAM_T210_H_
#define MEMORY_TYPE_NONE 0 #define MEMORY_TYPE_NONE 0
#define MEMORY_TYPE_DDR 0 #define MEMORY_TYPE_DDR 0
#define MEMORY_TYPE_LPDDR 0 #define MEMORY_TYPE_LPDDR 0
#define MEMORY_TYPE_DDR2 0 #define MEMORY_TYPE_DDR2 0
#define MEMORY_TYPE_LPDDR2 1 #define MEMORY_TYPE_LPDDR2 1
#define MEMORY_TYPE_DDR3 2 #define MEMORY_TYPE_DDR3L 2
#define MEMORY_TYPE_LPDDR4 3 #define MEMORY_TYPE_LPDDR4 3
/** /**

View file

@ -31,6 +31,8 @@
#include "../soc/t210.h" #include "../soc/t210.h"
#include "../utils/util.h" #include "../utils/util.h"
#define CONFIG_SDRAM_KEEP_ALIVE
#ifdef CONFIG_SDRAM_COMPRESS_CFG #ifdef CONFIG_SDRAM_COMPRESS_CFG
#include "../libs/compr/lz.h" #include "../libs/compr/lz.h"
#include "sdram_config_lz.inl" #include "sdram_config_lz.inl"
@ -117,10 +119,14 @@ static void _sdram_config(const sdram_params_t *params)
CLOCK(CLK_RST_CONTROLLER_PLLM_MISC1) = params->pllm_setup_control; CLOCK(CLK_RST_CONTROLLER_PLLM_MISC1) = params->pllm_setup_control;
CLOCK(CLK_RST_CONTROLLER_PLLM_MISC2) = 0; CLOCK(CLK_RST_CONTROLLER_PLLM_MISC2) = 0;
// u32 tmp = (params->pllm_feedback_divider << 8) | params->pllm_input_divider | ((params->pllm_post_divider & 0xFFFF) << 20); #ifdef CONFIG_SDRAM_KEEP_ALIVE
// CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = tmp; CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) =
// CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = tmp | 0x40000000; (params->pllm_feedback_divider << 8) | params->pllm_input_divider | ((params->pllm_post_divider & 0xFFFF) << 20) | PLLCX_BASE_ENABLE;
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = (params->pllm_feedback_divider << 8) | params->pllm_input_divider | 0x40000000 | ((params->pllm_post_divider & 0xFFFF) << 20); #else
u32 pllm_div = (params->pllm_feedback_divider << 8) | params->pllm_input_divider | ((params->pllm_post_divider & 0xFFFF) << 20);
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = pllm_div;
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = pllm_div | PLLCX_BASE_ENABLE;
#endif
u32 wait_end = get_tmr_us() + 300; u32 wait_end = get_tmr_us() + 300;
while (!(CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) & 0x8000000)) while (!(CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) & 0x8000000))
@ -553,9 +559,9 @@ break_nosleep:
// ZQ CAL setup (not actually issuing ZQ CAL now). // ZQ CAL setup (not actually issuing ZQ CAL now).
if (params->emc_zcal_warm_cold_boot_enables & 1) if (params->emc_zcal_warm_cold_boot_enables & 1)
{ {
if (params->memory_type == 2) if (params->memory_type == MEMORY_TYPE_DDR3L)
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt << 3; EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt << 3;
if (params->memory_type == 3) if (params->memory_type == MEMORY_TYPE_LPDDR4)
{ {
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt; EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt;
EMC(EMC_ZCAL_MRW_CMD) = params->emc_zcal_mrw_cmd; EMC(EMC_ZCAL_MRW_CMD) = params->emc_zcal_mrw_cmd;
@ -571,7 +577,7 @@ break_nosleep:
// Set clock enable signal. // Set clock enable signal.
u32 pin_gpio_cfg = (params->emc_pin_gpio_enable << 16) | (params->emc_pin_gpio << 12); u32 pin_gpio_cfg = (params->emc_pin_gpio_enable << 16) | (params->emc_pin_gpio << 12);
if (params->memory_type == 2 || params->memory_type == 3) if (params->memory_type == MEMORY_TYPE_DDR3L || params->memory_type == MEMORY_TYPE_LPDDR4)
{ {
EMC(EMC_PIN) = pin_gpio_cfg; EMC(EMC_PIN) = pin_gpio_cfg;
(void)EMC(EMC_PIN); (void)EMC(EMC_PIN);
@ -580,9 +586,9 @@ break_nosleep:
(void)EMC(EMC_PIN); (void)EMC(EMC_PIN);
} }
if (params->memory_type == 3) if (params->memory_type == MEMORY_TYPE_LPDDR4)
usleep(params->emc_pin_extra_wait + 2000); usleep(params->emc_pin_extra_wait + 2000);
else if (params->memory_type == 2) else if (params->memory_type == MEMORY_TYPE_DDR3L)
usleep(params->emc_pin_extra_wait + 500); usleep(params->emc_pin_extra_wait + 500);
// Enable clock enable signal. // Enable clock enable signal.
@ -591,15 +597,15 @@ break_nosleep:
usleep(params->emc_pin_program_wait); usleep(params->emc_pin_program_wait);
// Send NOP (trigger just needs to be non-zero). // Send NOP (trigger just needs to be non-zero).
if (params->memory_type != 3) if (params->memory_type != MEMORY_TYPE_LPDDR4)
EMC(EMC_NOP) = (params->emc_dev_select << 30) + 1; EMC(EMC_NOP) = (params->emc_dev_select << 30) + 1;
// On coldboot w/LPDDR2/3, wait 200 uSec after asserting CKE high. // On coldboot w/LPDDR2/3, wait 200 uSec after asserting CKE high.
if (params->memory_type == 1) if (params->memory_type == MEMORY_TYPE_LPDDR2)
usleep(params->emc_pin_extra_wait + 200); usleep(params->emc_pin_extra_wait + 200);
// Init zq calibration, // Init zq calibration,
if (params->memory_type == 3) if (params->memory_type == MEMORY_TYPE_LPDDR4)
{ {
// Patch 6 using BCT spare variables. // Patch 6 using BCT spare variables.
if (params->emc_bct_spare10) if (params->emc_bct_spare10)
@ -640,7 +646,7 @@ break_nosleep:
PMC(APBDEV_PMC_DDR_CFG) = params->pmc_ddr_cfg; PMC(APBDEV_PMC_DDR_CFG) = params->pmc_ddr_cfg;
// Start periodic ZQ calibration (LPDDRx only). // Start periodic ZQ calibration (LPDDRx only).
if (params->memory_type - 1 <= 2) if (params->memory_type && params->memory_type <= MEMORY_TYPE_LPDDR4)
{ {
EMC(EMC_ZCAL_INTERVAL) = params->emc_zcal_interval; EMC(EMC_ZCAL_INTERVAL) = params->emc_zcal_interval;
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt; EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt;

View file

@ -26,12 +26,12 @@
#ifndef _SDRAM_PARAM_T210_H_ #ifndef _SDRAM_PARAM_T210_H_
#define _SDRAM_PARAM_T210_H_ #define _SDRAM_PARAM_T210_H_
#define MEMORY_TYPE_NONE 0 #define MEMORY_TYPE_NONE 0
#define MEMORY_TYPE_DDR 0 #define MEMORY_TYPE_DDR 0
#define MEMORY_TYPE_LPDDR 0 #define MEMORY_TYPE_LPDDR 0
#define MEMORY_TYPE_DDR2 0 #define MEMORY_TYPE_DDR2 0
#define MEMORY_TYPE_LPDDR2 1 #define MEMORY_TYPE_LPDDR2 1
#define MEMORY_TYPE_DDR3 2 #define MEMORY_TYPE_DDR3L 2
#define MEMORY_TYPE_LPDDR4 3 #define MEMORY_TYPE_LPDDR4 3
/** /**