1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2023, Aspeed Technology Inc. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <arch.h> 8*91f16700Schasinglulu #include <common/debug.h> 9*91f16700Schasinglulu #include <drivers/arm/gicv3.h> 10*91f16700Schasinglulu #include <drivers/console.h> 11*91f16700Schasinglulu #include <lib/mmio.h> 12*91f16700Schasinglulu #include <lib/psci/psci.h> 13*91f16700Schasinglulu #include <plat/common/platform.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu static uintptr_t sec_ep; 16*91f16700Schasinglulu 17*91f16700Schasinglulu static int plat_pwr_domain_on(u_register_t mpidr) 18*91f16700Schasinglulu { 19*91f16700Schasinglulu unsigned int cpu = plat_core_pos_by_mpidr(mpidr); 20*91f16700Schasinglulu uintptr_t ep_reg; 21*91f16700Schasinglulu 22*91f16700Schasinglulu switch (cpu) { 23*91f16700Schasinglulu case 1U: 24*91f16700Schasinglulu ep_reg = SCU_CPU_SMP_EP1; 25*91f16700Schasinglulu break; 26*91f16700Schasinglulu case 2U: 27*91f16700Schasinglulu ep_reg = SCU_CPU_SMP_EP2; 28*91f16700Schasinglulu break; 29*91f16700Schasinglulu case 3U: 30*91f16700Schasinglulu ep_reg = SCU_CPU_SMP_EP3; 31*91f16700Schasinglulu break; 32*91f16700Schasinglulu default: 33*91f16700Schasinglulu return PSCI_E_INVALID_PARAMS; 34*91f16700Schasinglulu } 35*91f16700Schasinglulu 36*91f16700Schasinglulu mmio_write_64(ep_reg, sec_ep); 37*91f16700Schasinglulu 38*91f16700Schasinglulu dsbsy(); 39*91f16700Schasinglulu 40*91f16700Schasinglulu sev(); 41*91f16700Schasinglulu 42*91f16700Schasinglulu return PSCI_E_SUCCESS; 43*91f16700Schasinglulu } 44*91f16700Schasinglulu 45*91f16700Schasinglulu static void plat_pwr_domain_on_finish(const psci_power_state_t *target_state) 46*91f16700Schasinglulu { 47*91f16700Schasinglulu gicv3_rdistif_init(plat_my_core_pos()); 48*91f16700Schasinglulu gicv3_cpuif_enable(plat_my_core_pos()); 49*91f16700Schasinglulu } 50*91f16700Schasinglulu 51*91f16700Schasinglulu static const plat_psci_ops_t plat_psci_ops = { 52*91f16700Schasinglulu .pwr_domain_on = plat_pwr_domain_on, 53*91f16700Schasinglulu .pwr_domain_on_finish = plat_pwr_domain_on_finish, 54*91f16700Schasinglulu }; 55*91f16700Schasinglulu 56*91f16700Schasinglulu int plat_setup_psci_ops(uintptr_t sec_entrypoint, 57*91f16700Schasinglulu const plat_psci_ops_t **psci_ops) 58*91f16700Schasinglulu { 59*91f16700Schasinglulu sec_ep = sec_entrypoint; 60*91f16700Schasinglulu *psci_ops = &plat_psci_ops; 61*91f16700Schasinglulu 62*91f16700Schasinglulu return 0; 63*91f16700Schasinglulu } 64