diff --git a/plat/intel/soc/stratix10/plat_psci.c b/plat/intel/soc/stratix10/plat_psci.c deleted file mode 100644 index 73389c95d..000000000 --- a/plat/intel/soc/stratix10/plat_psci.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "platform_def.h" -#include "s10_reset_manager.h" -#include "socfpga_mailbox.h" - -#define S10_RSTMGR_OFST 0xffd11000 -#define S10_RSTMGR_MPUMODRST_OFST 0x20 - -uintptr_t *stratix10_sec_entry = (uintptr_t *) PLAT_SEC_ENTRY; -uintptr_t *cpuid_release = (uintptr_t *) PLAT_CPUID_RELEASE; - -/******************************************************************************* - * plat handler called when a CPU is about to enter standby. - ******************************************************************************/ -void plat_cpu_standby(plat_local_state_t cpu_state) -{ - /* - * Enter standby state - * dsb is good practice before using wfi to enter low power states - */ - VERBOSE("%s: cpu_state: 0x%x\n", __func__, cpu_state); - dsb(); - wfi(); -} - -/******************************************************************************* - * plat handler called when a power domain is about to be turned on. The - * mpidr determines the CPU to be turned on. - ******************************************************************************/ -int plat_pwr_domain_on(u_register_t mpidr) -{ - unsigned int cpu_id = plat_core_pos_by_mpidr(mpidr); - - VERBOSE("%s: mpidr: 0x%lx\n", __func__, mpidr); - - if (cpu_id == -1) - return PSCI_E_INTERN_FAIL; - - *cpuid_release = cpu_id; - - /* release core reset */ - mmio_setbits_32(S10_RSTMGR_OFST + S10_RSTMGR_MPUMODRST_OFST, - 1 << cpu_id); - return PSCI_E_SUCCESS; -} - -/******************************************************************************* - * plat handler called when a power domain is about to be turned off. The - * target_state encodes the power state that each level should transition to. - ******************************************************************************/ -void plat_pwr_domain_off(const psci_power_state_t *target_state) -{ - unsigned int cpu_id = plat_my_core_pos(); - - for (size_t i = 0; i <= PLAT_MAX_PWR_LVL; i++) - VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", - __func__, i, target_state->pwr_domain_state[i]); - - /* TODO: Prevent interrupts from spuriously waking up this cpu */ - /* gicv2_cpuif_disable(); */ - - /* assert core reset */ - mmio_setbits_32(S10_RSTMGR_OFST + S10_RSTMGR_MPUMODRST_OFST, - 1 << cpu_id); -} - -/******************************************************************************* - * plat handler called when a power domain is about to be suspended. The - * target_state encodes the power state that each level should transition to. - ******************************************************************************/ -void plat_pwr_domain_suspend(const psci_power_state_t *target_state) -{ - unsigned int cpu_id = plat_my_core_pos(); - - for (size_t i = 0; i <= PLAT_MAX_PWR_LVL; i++) - VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", - __func__, i, target_state->pwr_domain_state[i]); - /* assert core reset */ - mmio_setbits_32(S10_RSTMGR_OFST + S10_RSTMGR_MPUMODRST_OFST, - 1 << cpu_id); - -} - -/******************************************************************************* - * plat handler called when a power domain has just been powered on after - * being turned off earlier. The target_state encodes the low power state that - * each level has woken up from. - ******************************************************************************/ -void plat_pwr_domain_on_finish(const psci_power_state_t *target_state) -{ - for (size_t i = 0; i <= PLAT_MAX_PWR_LVL; i++) - VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", - __func__, i, target_state->pwr_domain_state[i]); - - /* Program the gic per-cpu distributor or re-distributor interface */ - gicv2_pcpu_distif_init(); - gicv2_set_pe_target_mask(plat_my_core_pos()); - - /* Enable the gic cpu interface */ - gicv2_cpuif_enable(); -} - -/******************************************************************************* - * plat handler called when a power domain has just been powered on after - * having been suspended earlier. The target_state encodes the low power state - * that each level has woken up from. - * TODO: At the moment we reuse the on finisher and reinitialize the secure - * context. Need to implement a separate suspend finisher. - ******************************************************************************/ -void plat_pwr_domain_suspend_finish(const psci_power_state_t *target_state) -{ - unsigned int cpu_id = plat_my_core_pos(); - - for (size_t i = 0; i <= PLAT_MAX_PWR_LVL; i++) - VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", - __func__, i, target_state->pwr_domain_state[i]); - - /* release core reset */ - mmio_clrbits_32(S10_RSTMGR_OFST + S10_RSTMGR_MPUMODRST_OFST, - 1 << cpu_id); -} - -/******************************************************************************* - * plat handlers to shutdown/reboot the system - ******************************************************************************/ -static void __dead2 plat_system_off(void) -{ - wfi(); - ERROR("System Off: operation not handled.\n"); - panic(); -} - -static void __dead2 plat_system_reset(void) -{ - INFO("assert Peripheral from Reset\r\n"); - - deassert_peripheral_reset(); - mailbox_reset_cold(); - - while (1) - wfi(); -} - -int plat_validate_power_state(unsigned int power_state, - psci_power_state_t *req_state) -{ - VERBOSE("%s: power_state: 0x%x\n", __func__, power_state); - - return PSCI_E_SUCCESS; -} - -int plat_validate_ns_entrypoint(unsigned long ns_entrypoint) -{ - VERBOSE("%s: ns_entrypoint: 0x%lx\n", __func__, ns_entrypoint); - return PSCI_E_SUCCESS; -} - -void plat_get_sys_suspend_power_state(psci_power_state_t *req_state) -{ - req_state->pwr_domain_state[PSCI_CPU_PWR_LVL] = PLAT_MAX_OFF_STATE; - req_state->pwr_domain_state[1] = PLAT_MAX_OFF_STATE; -} - -/******************************************************************************* - * Export the platform handlers via plat_arm_psci_pm_ops. The ARM Standard - * platform layer will take care of registering the handlers with PSCI. - ******************************************************************************/ -const plat_psci_ops_t plat_psci_pm_ops = { - .cpu_standby = plat_cpu_standby, - .pwr_domain_on = plat_pwr_domain_on, - .pwr_domain_off = plat_pwr_domain_off, - .pwr_domain_suspend = plat_pwr_domain_suspend, - .pwr_domain_on_finish = plat_pwr_domain_on_finish, - .pwr_domain_suspend_finish = plat_pwr_domain_suspend_finish, - .system_off = plat_system_off, - .system_reset = plat_system_reset, - .validate_power_state = plat_validate_power_state, - .validate_ns_entrypoint = plat_validate_ns_entrypoint, - .get_sys_suspend_power_state = plat_get_sys_suspend_power_state -}; - -/******************************************************************************* - * Export the platform specific power ops. - ******************************************************************************/ -int plat_setup_psci_ops(uintptr_t sec_entrypoint, - const struct plat_psci_ops **psci_ops) -{ - /* Save warm boot entrypoint.*/ - *stratix10_sec_entry = sec_entrypoint; - - *psci_ops = &plat_psci_pm_ops; - return 0; -} diff --git a/plat/intel/soc/stratix10/plat_sip_svc.c b/plat/intel/soc/stratix10/plat_sip_svc.c deleted file mode 100644 index 23a009d12..000000000 --- a/plat/intel/soc/stratix10/plat_sip_svc.c +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include -#include -#include -#include - -/* Number of SiP Calls implemented */ -#define SIP_NUM_CALLS 0x3 - -/* Total buffer the driver can hold */ -#define FPGA_CONFIG_BUFFER_SIZE 4 - -int current_block; -int current_buffer; -int current_id = 1; -int max_blocks; -uint32_t bytes_per_block; -uint32_t blocks_submitted; -uint32_t blocks_completed; - -struct fpga_config_info { - uint32_t addr; - int size; - int size_written; - uint32_t write_requested; - int subblocks_sent; - int block_number; -}; - -/* SiP Service UUID */ -DEFINE_SVC_UUID2(intl_svc_uid, - 0xa85273b0, 0xe85a, 0x4862, 0xa6, 0x2a, - 0xfa, 0x88, 0x88, 0x17, 0x68, 0x81); - -uint64_t plat_sip_handler(uint32_t smc_fid, - uint64_t x1, - uint64_t x2, - uint64_t x3, - uint64_t x4, - void *cookie, - void *handle, - uint64_t flags) -{ - ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); - SMC_RET1(handle, SMC_UNK); -} - -struct fpga_config_info fpga_config_buffers[FPGA_CONFIG_BUFFER_SIZE]; - -static void intel_fpga_sdm_write_buffer(struct fpga_config_info *buffer) -{ - uint32_t args[3]; - - while (max_blocks > 0 && buffer->size > buffer->size_written) { - if (buffer->size - buffer->size_written <= - bytes_per_block) { - args[0] = (1<<8); - args[1] = buffer->addr + buffer->size_written; - args[2] = buffer->size - buffer->size_written; - buffer->size_written += - buffer->size - buffer->size_written; - buffer->subblocks_sent++; - mailbox_send_cmd_async(0x4, - MBOX_RECONFIG_DATA, - args, 3, 0); - current_buffer++; - current_buffer %= FPGA_CONFIG_BUFFER_SIZE; - } else { - args[0] = (1<<8); - args[1] = buffer->addr + buffer->size_written; - args[2] = bytes_per_block; - buffer->size_written += bytes_per_block; - mailbox_send_cmd_async(0x4, - MBOX_RECONFIG_DATA, - args, 3, 0); - buffer->subblocks_sent++; - } - max_blocks--; - } -} - -static int intel_fpga_sdm_write_all(void) -{ - int i; - - for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) - intel_fpga_sdm_write_buffer( - &fpga_config_buffers[current_buffer]); - - return 0; -} - -uint32_t intel_mailbox_fpga_config_isdone(void) -{ - uint32_t args[2]; - uint32_t response[6]; - int status; - - status = mailbox_send_cmd(1, MBOX_RECONFIG_STATUS, args, 0, 0, - response); - - if (status < 0) - return INTEL_SIP_SMC_STATUS_ERROR; - - if (response[RECONFIG_STATUS_STATE] && - response[RECONFIG_STATUS_STATE] != MBOX_CFGSTAT_STATE_CONFIG) - return INTEL_SIP_SMC_STATUS_ERROR; - - if (!(response[RECONFIG_STATUS_PIN_STATUS] & PIN_STATUS_NSTATUS)) - return INTEL_SIP_SMC_STATUS_ERROR; - - if (response[RECONFIG_STATUS_SOFTFUNC_STATUS] & - SOFTFUNC_STATUS_SEU_ERROR) - return INTEL_SIP_SMC_STATUS_ERROR; - - if ((response[RECONFIG_STATUS_SOFTFUNC_STATUS] & - SOFTFUNC_STATUS_CONF_DONE) && - (response[RECONFIG_STATUS_SOFTFUNC_STATUS] & - SOFTFUNC_STATUS_INIT_DONE)) - return INTEL_SIP_SMC_STATUS_OK; - - return INTEL_SIP_SMC_STATUS_ERROR; -} - -static int mark_last_buffer_xfer_completed(uint32_t *buffer_addr_completed) -{ - int i; - - for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { - if (fpga_config_buffers[i].block_number == current_block) { - fpga_config_buffers[i].subblocks_sent--; - if (fpga_config_buffers[i].subblocks_sent == 0 - && fpga_config_buffers[i].size <= - fpga_config_buffers[i].size_written) { - fpga_config_buffers[i].write_requested = 0; - current_block++; - *buffer_addr_completed = - fpga_config_buffers[i].addr; - return 0; - } - } - } - - return -1; -} - -unsigned int address_in_ddr(uint32_t *addr) -{ - if (((unsigned long long)addr > DRAM_BASE) && - ((unsigned long long)addr < DRAM_BASE + DRAM_SIZE)) - return 0; - - return -1; -} - -int intel_fpga_config_completed_write(uint32_t *completed_addr, - uint32_t *count) -{ - uint32_t status = INTEL_SIP_SMC_STATUS_OK; - *count = 0; - int resp_len = 0; - uint32_t resp[5]; - int all_completed = 1; - int count_check = 0; - - if (address_in_ddr(completed_addr) != 0 || address_in_ddr(count) != 0) - return INTEL_SIP_SMC_STATUS_ERROR; - - for (count_check = 0; count_check < 3; count_check++) - if (address_in_ddr(&completed_addr[*count + count_check]) != 0) - return INTEL_SIP_SMC_STATUS_ERROR; - - resp_len = mailbox_read_response(0x4, resp); - - while (resp_len >= 0 && *count < 3) { - max_blocks++; - if (mark_last_buffer_xfer_completed( - &completed_addr[*count]) == 0) - *count = *count + 1; - else - break; - resp_len = mailbox_read_response(0x4, resp); - } - - if (*count <= 0) { - if (resp_len != MBOX_NO_RESPONSE && - resp_len != MBOX_TIMEOUT && resp_len != 0) { - return INTEL_SIP_SMC_STATUS_ERROR; - } - - *count = 0; - } - - intel_fpga_sdm_write_all(); - - if (*count > 0) - status = INTEL_SIP_SMC_STATUS_OK; - else if (*count == 0) - status = INTEL_SIP_SMC_STATUS_BUSY; - - for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { - if (fpga_config_buffers[i].write_requested != 0) { - all_completed = 0; - break; - } - } - - if (all_completed == 1) - return INTEL_SIP_SMC_STATUS_OK; - - return status; -} - -int intel_fpga_config_start(uint32_t config_type) -{ - uint32_t response[3]; - int status = 0; - - status = mailbox_send_cmd(2, MBOX_RECONFIG, 0, 0, 0, - response); - - if (status < 0) - return status; - - max_blocks = response[0]; - bytes_per_block = response[1]; - - for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { - fpga_config_buffers[i].size = 0; - fpga_config_buffers[i].size_written = 0; - fpga_config_buffers[i].addr = 0; - fpga_config_buffers[i].write_requested = 0; - fpga_config_buffers[i].block_number = 0; - fpga_config_buffers[i].subblocks_sent = 0; - } - - blocks_submitted = 0; - current_block = 0; - current_buffer = 0; - - return 0; -} - - -uint32_t intel_fpga_config_write(uint64_t mem, uint64_t size) -{ - int i = 0; - uint32_t status = INTEL_SIP_SMC_STATUS_OK; - - if (mem < DRAM_BASE || mem > DRAM_BASE + DRAM_SIZE) - status = INTEL_SIP_SMC_STATUS_REJECTED; - - if (mem + size > DRAM_BASE + DRAM_SIZE) - status = INTEL_SIP_SMC_STATUS_REJECTED; - - for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { - if (!fpga_config_buffers[i].write_requested) { - fpga_config_buffers[i].addr = mem; - fpga_config_buffers[i].size = size; - fpga_config_buffers[i].size_written = 0; - fpga_config_buffers[i].write_requested = 1; - fpga_config_buffers[i].block_number = - blocks_submitted++; - fpga_config_buffers[i].subblocks_sent = 0; - break; - } - } - - - if (i == FPGA_CONFIG_BUFFER_SIZE) { - status = INTEL_SIP_SMC_STATUS_REJECTED; - return status; - } else if (i == FPGA_CONFIG_BUFFER_SIZE - 1) { - status = INTEL_SIP_SMC_STATUS_BUSY; - } - - intel_fpga_sdm_write_all(); - - return status; -} - -/* - * This function is responsible for handling all SiP calls from the NS world - */ - -uintptr_t sip_smc_handler(uint32_t smc_fid, - u_register_t x1, - u_register_t x2, - u_register_t x3, - u_register_t x4, - void *cookie, - void *handle, - u_register_t flags) -{ - uint32_t status = INTEL_SIP_SMC_STATUS_OK; - uint32_t completed_addr[3]; - uint32_t count = 0; - - switch (smc_fid) { - case SIP_SVC_UID: - /* Return UID to the caller */ - SMC_UUID_RET(handle, intl_svc_uid); - break; - case INTEL_SIP_SMC_FPGA_CONFIG_ISDONE: - status = intel_mailbox_fpga_config_isdone(); - SMC_RET4(handle, status, 0, 0, 0); - break; - case INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM: - SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, - INTEL_SIP_SMC_FPGA_CONFIG_ADDR, - INTEL_SIP_SMC_FPGA_CONFIG_SIZE - - INTEL_SIP_SMC_FPGA_CONFIG_ADDR); - break; - case INTEL_SIP_SMC_FPGA_CONFIG_START: - status = intel_fpga_config_start(x1); - SMC_RET4(handle, status, 0, 0, 0); - break; - case INTEL_SIP_SMC_FPGA_CONFIG_WRITE: - status = intel_fpga_config_write(x1, x2); - SMC_RET4(handle, status, 0, 0, 0); - break; - case INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE: - status = intel_fpga_config_completed_write(completed_addr, - &count); - switch (count) { - case 1: - SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, - completed_addr[0], 0, 0); - break; - case 2: - SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, - completed_addr[0], - completed_addr[1], 0); - break; - case 3: - SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, - completed_addr[0], - completed_addr[1], - completed_addr[2]); - break; - case 0: - SMC_RET4(handle, status, 0, 0, 0); - break; - default: - SMC_RET1(handle, INTEL_SIP_SMC_STATUS_ERROR); - } - break; - - default: - return plat_sip_handler(smc_fid, x1, x2, x3, x4, - cookie, handle, flags); - } -} - -DECLARE_RT_SVC( - s10_sip_svc, - OEN_SIP_START, - OEN_SIP_END, - SMC_TYPE_FAST, - NULL, - sip_smc_handler -); - -DECLARE_RT_SVC( - s10_sip_svc_std, - OEN_SIP_START, - OEN_SIP_END, - SMC_TYPE_YIELD, - NULL, - sip_smc_handler -);