void sgrf_init(void) { /* setting all configurable ip into no-secure */ mmio_write_32(SGRF_BASE + SGRF_SOC_CON(5), SGRF_SOC_CON_NS); mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6), SGRF_SOC_CON7_BITS); mmio_write_32(SGRF_BASE + SGRF_SOC_CON(7), SGRF_SOC_CON_NS); /* secure dma to no sesure */ mmio_write_32(SGRF_BASE + SGRF_BUSDMAC_CON(0), SGRF_BUSDMAC_CON0_NS); mmio_write_32(SGRF_BASE + SGRF_BUSDMAC_CON(1), SGRF_BUSDMAC_CON1_NS); dsb(); /* rst dma1 */ mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1), RST_DMA1_MSK | (RST_DMA1_MSK << 16)); /* rst dma2 */ mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4), RST_DMA2_MSK | (RST_DMA2_MSK << 16)); dsb(); /* release dma1 rst*/ mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1), (RST_DMA1_MSK << 16)); /* release dma2 rst*/ mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4), (RST_DMA2_MSK << 16)); }
static int cores_pwr_domain_on(unsigned long mpidr, uint64_t entrypoint) { uint32_t cpu, cluster; uint32_t cpuon_id; cpu = MPIDR_AFFLVL0_VAL(mpidr); cluster = MPIDR_AFFLVL1_VAL(mpidr); /* Make sure the cpu is off,Before power up the cpu! */ cpus_id_power_domain(cluster, cpu, pmu_pd_off, CKECK_WFEI_MSK); cpuon_id = (cluster * PLATFORM_CLUSTER0_CORE_COUNT) + cpu; assert(cpuson_flags[cpuon_id] == 0); cpuson_flags[cpuon_id] = PMU_CPU_HOTPLUG; cpuson_entry_point[cpuon_id] = entrypoint; /* Switch boot addr to pmusram */ mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1 + cluster), (PMUSRAM_BASE >> CPU_BOOT_ADDR_ALIGN) | CPU_BOOT_ADDR_WMASK); dsb(); cpus_id_power_domain(cluster, cpu, pmu_pd_on, CKECK_WFEI_MSK); mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1 + cluster), (COLD_BOOT_BASE >> CPU_BOOT_ADDR_ALIGN) | CPU_BOOT_ADDR_WMASK); return 0; }
static void pmu_set_sleep_mode(void) { ddr_suspend_save(); pmu_sleep_mode_config(); soc_sleep_config(); regs_updata_bit_set(PMU_BASE + PMU_PWRMD_CORE, pmu_mdcr_global_int_dis); regs_updata_bit_set(PMU_BASE + PMU_SFT_CON, pmu_sft_glbl_int_dis_b); pmu_scu_b_pwrdn(); mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1), (PMUSRAM_BASE >> CPU_BOOT_ADDR_ALIGN) | CPU_BOOT_ADDR_WMASK); mmio_write_32(SGRF_BASE + SGRF_SOC_CON(2), (PMUSRAM_BASE >> CPU_BOOT_ADDR_ALIGN) | CPU_BOOT_ADDR_WMASK); }
mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1 + cluster), (COLD_BOOT_BASE >> CPU_BOOT_ADDR_ALIGN) | CPU_BOOT_ADDR_WMASK); return 0; } static int cores_pwr_domain_on_finish(void) { return 0; } static int sys_pwr_domain_resume(void) { mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1), (COLD_BOOT_BASE >> CPU_BOOT_ADDR_ALIGN) | CPU_BOOT_ADDR_WMASK); mmio_write_32(SGRF_BASE + SGRF_SOC_CON(2), (COLD_BOOT_BASE >> CPU_BOOT_ADDR_ALIGN) | CPU_BOOT_ADDR_WMASK); pm_plls_resume(); pmu_scu_b_pwrup(); return 0; } static int sys_pwr_domain_suspend(void) { nonboot_cpus_off(); pmu_set_sleep_mode();