coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
spm.c File Reference
#include <assert.h>
#include <console/console.h>
#include <delay.h>
#include <soc/mcu_common.h>
#include <soc/spm.h>
#include <soc/spm_common.h>
#include <soc/symbols.h>
#include <timer.h>
Include dependency graph for spm.c:

Go to the source code of this file.

Macros

#define SPM_SYSTEM_BASE_OFFSET   0x40000000
 

Functions

static void spm_set_power_control (const struct pwr_ctrl *pwrctrl)
 
static void spm_hw_s1_state_monitor (int en)
 
static void spm_register_init (void)
 
static void spm_extern_initialize (void)
 
static void spm_set_sysclk_settle (void)
 
static void spm_code_swapping (void)
 
static void spm_reset_and_init_pcm (void)
 
static void spm_kick_im_to_fetch (const struct dyna_load_pcm *pcm)
 
static void spm_init_pcm_register (void)
 
static void spm_set_wakeup_event (const struct pwr_ctrl *pwrctrl)
 
static void spm_set_pcm_flags (const struct pwr_ctrl *pwrctrl)
 
static void spm_kick_pcm_to_run (const struct pwr_ctrl *pwrctrl)
 
static void reset_spm (struct mtk_mcu *mcu)
 
int spm_init (void)
 

Variables

static const struct pwr_ctrl spm_init_ctrl
 
static struct mtk_mcu spm
 

Macro Definition Documentation

◆ SPM_SYSTEM_BASE_OFFSET

#define SPM_SYSTEM_BASE_OFFSET   0x40000000

Definition at line 17 of file spm.c.

Function Documentation

◆ reset_spm()

static void reset_spm ( struct mtk_mcu mcu)
static

◆ spm_code_swapping()

static void spm_code_swapping ( void  )
static

Definition at line 465 of file spm.c.

References mask, mtk_spm, read32(), mtk_spm_regs::spm_cpu_wakeup_event, mtk_spm_regs::spm_wakeup_event_mask, SPM_WAKEUP_EVENT_MASK_BIT0, and write32().

Referenced by spm_reset_and_init_pcm().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spm_extern_initialize()

static void spm_extern_initialize ( void  )
static

Definition at line 453 of file spm.c.

References mtk_spm, SET32_BITFIELDS, and mtk_spm_regs::spm_dvfs_misc.

Referenced by spm_init().

Here is the caller graph for this function:

◆ spm_hw_s1_state_monitor()

static void spm_hw_s1_state_monitor ( int  en)
static

Definition at line 370 of file spm.c.

References mtk_spm, SET32_BITFIELDS, SPM_ACK_CHK_3_CON_CLR_ALL, and mtk_spm_regs::spm_ack_chk_con_3.

Referenced by spm_register_init().

Here is the caller graph for this function:

◆ spm_init()

◆ spm_init_pcm_register()

static void spm_init_pcm_register ( void  )
static

Definition at line 542 of file spm.c.

References mtk_spm, mtk_spm_regs::pcm_pwr_io_en, mtk_spm_regs::pcm_reg_data_ini, PCM_RF_SYNC_R0, PCM_RF_SYNC_R7, read32(), mtk_spm_regs::spm_power_on_val0, mtk_spm_regs::spm_power_on_val1, and write32().

Referenced by reset_spm().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spm_kick_im_to_fetch()

◆ spm_kick_pcm_to_run()

◆ spm_register_init()

static void spm_register_init ( void  )
static

Definition at line 386 of file spm.c.

References AP_PLL_CON3, AP_PLL_CON4, APMIX_CON3_DEF, APMIX_CON4_DEF, mtk_spm_regs::armpll_clk_sel, ARMPLL_CLK_SEL_DEF, BCLK_CG_EN_LSB, CLK_SCP_CFG_0, CLK_SCP_CFG_1, mtk_spm_regs::ddren_dbc_con, DDREN_DBC_EN_VAL, ISRC_ALL, ISRM_ALL, mtk_spm, PCM_CK_EN_LSB, mtk_spm_regs::pcm_con0, mtk_spm_regs::pcm_con1, mtk_spm_regs::pcm_pwr_io_en, mtk_spm_regs::pcm_reg_data_ini, PCM_RF_SYNC_R7, PCM_SW_INT_ALL, PCM_SW_RESET_LSB, POWER_ON_VAL1_DEF, mtk_spm_regs::poweron_config_set, read32(), REG_DDREN_DBC_EN_LSB, REG_MD32_APB_INTERNAL_EN_LSB, REG_SYSCLK1_SRC_MD2_SRCCLKENA, RG_AHBMIF_APBEN_LSB, SCP_CFG0_DEF, SCP_CFG1_DEF, SET32_BITFIELDS, SPM_ACK_CHK_3_HW_S1_CNT, SPM_ACK_CHK_3_SEL_HW_S1, mtk_spm_regs::spm_ack_chk_sel_3, mtk_spm_regs::spm_ack_chk_timer_3, mtk_spm_regs::spm_clk_con, SPM_DVFS_FORCE_ENABLE_LSB, mtk_spm_regs::spm_dvfs_level, SPM_DVFS_LEVEL_DEF, mtk_spm_regs::spm_dvfs_misc, SPM_DVFSRC_ENABLE_LSB, mtk_spm_regs::spm_dvs_dfs_level, SPM_DVS_DFS_LEVEL_DEF, spm_hw_s1_state_monitor(), mtk_spm_regs::spm_irq_mask, mtk_spm_regs::spm_irq_sta, mtk_spm_regs::spm_power_on_val1, SPM_REGWR_CFG_KEY, mtk_spm_regs::spm_resource_ack_con0, SPM_RESOURCE_ACK_CON0_DEF, mtk_spm_regs::spm_resource_ack_con1, SPM_RESOURCE_ACK_CON1_DEF, mtk_spm_regs::spm_resource_ack_con2, SPM_RESOURCE_ACK_CON2_DEF, mtk_spm_regs::spm_resource_ack_con3, SPM_RESOURCE_ACK_CON3_DEF, mtk_spm_regs::spm_swint_clr, mtk_spm_regs::spm_wakeup_event_mask, SPM_WAKEUP_EVENT_MASK_DEF, and write32().

Referenced by spm_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spm_reset_and_init_pcm()

◆ spm_set_pcm_flags()

static void spm_set_pcm_flags ( const struct pwr_ctrl pwrctrl)
static

◆ spm_set_power_control()

static void spm_set_power_control ( const struct pwr_ctrl pwrctrl)
static

Definition at line 190 of file spm.c.

References BIT, mtk_spm, mtk_spm_regs::nna_pwr_con, pwr_ctrl::reg_adsp2spm_wakeup_mask_b, pwr_ctrl::reg_afe_apsrc_req_mask_b, pwr_ctrl::reg_afe_ddren_req_mask_b, pwr_ctrl::reg_afe_infra_req_mask_b, pwr_ctrl::reg_afe_srcclkena_mask_b, pwr_ctrl::reg_afe_vrf18_req_mask_b, pwr_ctrl::reg_apu_apsrc_req_mask_b, pwr_ctrl::reg_apu_ddren_req_mask_b, pwr_ctrl::reg_apu_infra_req_mask_b, pwr_ctrl::reg_apu_srcclkena_mask_b, pwr_ctrl::reg_apu_vrf18_req_mask_b, pwr_ctrl::reg_audio_dsp_apsrc_req_mask_b, pwr_ctrl::reg_audio_dsp_ddren_req_mask_b, pwr_ctrl::reg_audio_dsp_infra_req_mask_b, pwr_ctrl::reg_audio_dsp_srcclkena_mask_b, pwr_ctrl::reg_audio_dsp_vrf18_req_mask_b, pwr_ctrl::reg_bak_psri_apsrc_req_mask_b, pwr_ctrl::reg_bak_psri_ddren_req_mask_b, pwr_ctrl::reg_bak_psri_infra_req_mask_b, pwr_ctrl::reg_bak_psri_srcclkena_mask_b, pwr_ctrl::reg_bak_psri_vrf18_req_mask_b, pwr_ctrl::reg_ccif_event_apsrc_req_mask_b, pwr_ctrl::reg_ccif_event_infra_req_mask_b, pwr_ctrl::reg_ccif_event_srcclkena_mask_b, pwr_ctrl::reg_cg_check_apsrc_req_mask_b, pwr_ctrl::reg_cg_check_ddren_req_mask_b, pwr_ctrl::reg_cg_check_srcclkena_mask_b, pwr_ctrl::reg_cg_check_vrf18_req_mask_b, pwr_ctrl::reg_conn_apsrc_req_mask_b, pwr_ctrl::reg_conn_apsrc_sel, pwr_ctrl::reg_conn_ddren_req_mask_b, pwr_ctrl::reg_conn_infra_req_mask_b, pwr_ctrl::reg_conn_srcclkena_mask_b, pwr_ctrl::reg_conn_srcclkenb2pwrap_mask_b, pwr_ctrl::reg_conn_srcclkenb_mask_b, pwr_ctrl::reg_conn_vfe28_mask_b, pwr_ctrl::reg_conn_vrf18_req_mask_b, pwr_ctrl::reg_csyspwrup_ack_mask, pwr_ctrl::reg_disp0_apsrc_req_mask_b, pwr_ctrl::reg_disp0_ddren_req_mask_b, pwr_ctrl::reg_disp1_apsrc_req_mask_b, pwr_ctrl::reg_disp1_ddren_req_mask_b, pwr_ctrl::reg_dpmaif_apsrc_req_mask_b, pwr_ctrl::reg_dpmaif_ddren_req_mask_b, pwr_ctrl::reg_dpmaif_infra_req_mask_b, pwr_ctrl::reg_dpmaif_srcclkena_mask_b, pwr_ctrl::reg_dpmaif_vrf18_req_mask_b, pwr_ctrl::reg_dramc_md32_apsrc_req_mask_b, pwr_ctrl::reg_dramc_md32_infra_req_mask_b, pwr_ctrl::reg_dramc_md32_vrf18_req_mask_b, pwr_ctrl::reg_dvfsrc_event_trigger_mask_b, pwr_ctrl::reg_ext_wakeup_event_mask, pwr_ctrl::reg_gce_apsrc_req_mask_b, pwr_ctrl::reg_gce_ddren_req_mask_b, pwr_ctrl::reg_gce_infra_req_mask_b, pwr_ctrl::reg_gce_vrf18_req_mask_b, pwr_ctrl::reg_infrasys_apsrc_req_mask_b, pwr_ctrl::reg_infrasys_ddren_req_mask_b, pwr_ctrl::reg_mcupm_apsrc_req_mask_b, pwr_ctrl::reg_mcupm_ddren_req_mask_b, pwr_ctrl::reg_mcupm_infra_req_mask_b, pwr_ctrl::reg_mcupm_srcclkena_mask_b, pwr_ctrl::reg_mcupm_vrf18_req_mask_b, pwr_ctrl::reg_mcusys_idle_mask, pwr_ctrl::reg_mcusys_merge_apsrc_req_mask_b, pwr_ctrl::reg_mcusys_merge_ddren_req_mask_b, pwr_ctrl::reg_md_0_apsrc_req_mask_b, pwr_ctrl::reg_md_0_ddren_req_mask_b, pwr_ctrl::reg_md_0_infra_req_mask_b, pwr_ctrl::reg_md_0_srcclkena_mask_b, pwr_ctrl::reg_md_0_vrf18_req_mask_b, pwr_ctrl::reg_md_1_apsrc_req_mask_b, pwr_ctrl::reg_md_1_ddren_req_mask_b, pwr_ctrl::reg_md_1_infra_req_mask_b, pwr_ctrl::reg_md_1_srcclkena_mask_b, pwr_ctrl::reg_md_1_vrf18_req_mask_b, pwr_ctrl::reg_md_apsrc_0_sel, pwr_ctrl::reg_md_apsrc_1_sel, pwr_ctrl::reg_mp0_cputop_idle_mask, pwr_ctrl::reg_mp1_cputop_idle_mask, pwr_ctrl::reg_msdc0_apsrc_req_mask_b, pwr_ctrl::reg_msdc0_ddren_req_mask_b, pwr_ctrl::reg_msdc0_infra_req_mask_b, pwr_ctrl::reg_msdc0_srcclkena_mask_b, pwr_ctrl::reg_msdc0_vrf18_req_mask_b, pwr_ctrl::reg_msdc1_apsrc_req_mask_b, pwr_ctrl::reg_msdc1_ddren_req_mask_b, pwr_ctrl::reg_msdc1_infra_req_mask_b, pwr_ctrl::reg_msdc1_srcclkena_mask_b, pwr_ctrl::reg_msdc1_vrf18_req_mask_b, pwr_ctrl::reg_msdc2_apsrc_req_mask_b, pwr_ctrl::reg_msdc2_ddren_req_mask_b, pwr_ctrl::reg_msdc2_infra_req_mask_b, pwr_ctrl::reg_msdc2_srcclkena_mask_b, pwr_ctrl::reg_msdc2_vrf18_req_mask_b, pwr_ctrl::reg_pcie_apsrc_req_mask_b, pwr_ctrl::reg_pcie_ddren_req_mask_b, pwr_ctrl::reg_pcie_infra_req_mask_b, pwr_ctrl::reg_pcie_srcclkena_mask_b, pwr_ctrl::reg_pcie_vrf18_req_mask_b, pwr_ctrl::reg_scp2spm_wakeup_mask_b, pwr_ctrl::reg_scp_apsrc_req_mask_b, pwr_ctrl::reg_scp_ddren_req_mask_b, pwr_ctrl::reg_scp_infra_req_mask_b, pwr_ctrl::reg_scp_srcclkena_mask_b, pwr_ctrl::reg_scp_vrf18_req_mask_b, pwr_ctrl::reg_spm_adsp_mailbox_req, pwr_ctrl::reg_spm_apsrc_req, pwr_ctrl::reg_spm_ddren_req, pwr_ctrl::reg_spm_dvfs_req, pwr_ctrl::reg_spm_f26m_req, pwr_ctrl::reg_spm_infra_req, pwr_ctrl::reg_spm_reserved_apsrc_req_mask_b, pwr_ctrl::reg_spm_reserved_ddren_req_mask_b, pwr_ctrl::reg_spm_reserved_infra_req_mask_b, pwr_ctrl::reg_spm_reserved_srcclkena_mask_b, pwr_ctrl::reg_spm_reserved_vrf18_req_mask_b, pwr_ctrl::reg_spm_scp_mailbox_req, pwr_ctrl::reg_spm_sspm_mailbox_req, pwr_ctrl::reg_spm_sw_mailbox_req, pwr_ctrl::reg_spm_vrf18_req, pwr_ctrl::reg_srcclkeni_infra_req_mask_b, pwr_ctrl::reg_srcclkeni_srcclkena_mask_b, pwr_ctrl::reg_sspm2spm_wakeup_mask_b, pwr_ctrl::reg_sspm_apsrc_req_mask_b, pwr_ctrl::reg_sspm_ddren_req_mask_b, pwr_ctrl::reg_sspm_infra_req_mask_b, pwr_ctrl::reg_sspm_srcclkena_mask_b, pwr_ctrl::reg_sspm_vrf18_req_mask_b, pwr_ctrl::reg_sw2spm_wakeup_mask_b, pwr_ctrl::reg_ufs_apsrc_req_mask_b, pwr_ctrl::reg_ufs_ddren_req_mask_b, pwr_ctrl::reg_ufs_infra_req_mask_b, pwr_ctrl::reg_ufs_srcclkena_mask_b, pwr_ctrl::reg_ufs_vrf18_req_mask_b, pwr_ctrl::reg_wakeup_event_mask, pwr_ctrl::reg_wfi_op, pwr_ctrl::reg_wfi_type, mtk_spm_regs::spm_ap_standby_con, mtk_spm_regs::spm_src2_mask, mtk_spm_regs::spm_src3_mask, mtk_spm_regs::spm_src4_mask, mtk_spm_regs::spm_src5_mask, mtk_spm_regs::spm_src6_mask, mtk_spm_regs::spm_src7_mask, mtk_spm_regs::spm_src_mask, mtk_spm_regs::spm_src_req, mtk_spm_regs::spm_wakeup_event_ext_mask, mtk_spm_regs::spm_wakeup_event_mask, and write32().

Referenced by reset_spm(), and spm_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spm_set_sysclk_settle()

static void spm_set_sysclk_settle ( void  )
static

Definition at line 460 of file spm.c.

References mtk_spm, mtk_spm_regs::spm_clk_settle, SPM_SYSCLK_SETTLE, and write32().

Referenced by spm_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spm_set_wakeup_event()

Variable Documentation

◆ spm

struct mtk_mcu spm
static
Initial value:
= {
.firmware_name = CONFIG_SPM_FIRMWARE,
.reset = reset_spm,
}
static void reset_spm(struct mtk_mcu *mcu)
Definition: spm.c:643

Definition at line 643 of file spm.c.

Referenced by spm_init().

◆ spm_init_ctrl

const struct pwr_ctrl spm_init_ctrl
static

Definition at line 1 of file spm.c.

Referenced by reset_spm(), and spm_init().