1c76d4239SHadi Asyrafi /* 26197dc98SJit Loon Lim * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved. 38fb1b484SKah Jing Lee * Copyright (c) 2019-2023, Intel Corporation. All rights reserved. 48fb1b484SKah Jing Lee * Copyright (c) 2024, Altera Corporation. All rights reserved. 5c76d4239SHadi Asyrafi * 6c76d4239SHadi Asyrafi * SPDX-License-Identifier: BSD-3-Clause 7c76d4239SHadi Asyrafi */ 8c76d4239SHadi Asyrafi 9c76d4239SHadi Asyrafi #include <assert.h> 10c76d4239SHadi Asyrafi #include <common/debug.h> 11c76d4239SHadi Asyrafi #include <common/runtime_svc.h> 1213d33d52SHadi Asyrafi #include <lib/mmio.h> 13c76d4239SHadi Asyrafi #include <tools_share/uuid.h> 14c76d4239SHadi Asyrafi 15286b96f4SSieu Mun Tang #include "socfpga_fcs.h" 16c76d4239SHadi Asyrafi #include "socfpga_mailbox.h" 176197dc98SJit Loon Lim #include "socfpga_plat_def.h" 189c8f3af5SHadi Asyrafi #include "socfpga_reset_manager.h" 19d25041bfSHadi Asyrafi #include "socfpga_sip_svc.h" 206197dc98SJit Loon Lim #include "socfpga_system_manager.h" 21c76d4239SHadi Asyrafi 22c76d4239SHadi Asyrafi /* Total buffer the driver can hold */ 23c76d4239SHadi Asyrafi #define FPGA_CONFIG_BUFFER_SIZE 4 24c76d4239SHadi Asyrafi 25673afd6fSSieu Mun Tang static config_type request_type = NO_REQUEST; 26aad868b4SAbdul Halim, Muhammad Hadi Asyrafi static int current_block, current_buffer; 27ec4f28ecSAbdul Halim, Muhammad Hadi Asyrafi static int read_block, max_blocks; 28aad868b4SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t send_id, rcv_id; 29aad868b4SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t bytes_per_block, blocks_submitted; 30276a4366SSieu Mun Tang static bool bridge_disable; 31c76d4239SHadi Asyrafi 32984e236eSSieu Mun Tang /* RSU static variables */ 3344eb782eSChee Hong Ang static uint32_t rsu_dcmf_ver[4] = {0}; 34984e236eSSieu Mun Tang static uint16_t rsu_dcmf_stat[4] = {0}; 35673afd6fSSieu Mun Tang static uint32_t rsu_max_retry; 36c76d4239SHadi Asyrafi 37c76d4239SHadi Asyrafi /* SiP Service UUID */ 38c76d4239SHadi Asyrafi DEFINE_SVC_UUID2(intl_svc_uid, 39c76d4239SHadi Asyrafi 0xa85273b0, 0xe85a, 0x4862, 0xa6, 0x2a, 40c76d4239SHadi Asyrafi 0xfa, 0x88, 0x88, 0x17, 0x68, 0x81); 41c76d4239SHadi Asyrafi 42e5ebe87bSHadi Asyrafi static uint64_t socfpga_sip_handler(uint32_t smc_fid, 43c76d4239SHadi Asyrafi uint64_t x1, 44c76d4239SHadi Asyrafi uint64_t x2, 45c76d4239SHadi Asyrafi uint64_t x3, 46c76d4239SHadi Asyrafi uint64_t x4, 47c76d4239SHadi Asyrafi void *cookie, 48c76d4239SHadi Asyrafi void *handle, 49c76d4239SHadi Asyrafi uint64_t flags) 50c76d4239SHadi Asyrafi { 51c76d4239SHadi Asyrafi ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); 52c76d4239SHadi Asyrafi SMC_RET1(handle, SMC_UNK); 53c76d4239SHadi Asyrafi } 54c76d4239SHadi Asyrafi 55c76d4239SHadi Asyrafi struct fpga_config_info fpga_config_buffers[FPGA_CONFIG_BUFFER_SIZE]; 56c76d4239SHadi Asyrafi 577c58fd4eSHadi Asyrafi static int intel_fpga_sdm_write_buffer(struct fpga_config_info *buffer) 58c76d4239SHadi Asyrafi { 59ea9b9627SAbdul Halim, Muhammad Hadi Asyrafi uint32_t args[3]; 60c76d4239SHadi Asyrafi 61c76d4239SHadi Asyrafi while (max_blocks > 0 && buffer->size > buffer->size_written) { 62c76d4239SHadi Asyrafi args[0] = (1<<8); 63c76d4239SHadi Asyrafi args[1] = buffer->addr + buffer->size_written; 647c58fd4eSHadi Asyrafi if (buffer->size - buffer->size_written <= bytes_per_block) { 65c76d4239SHadi Asyrafi args[2] = buffer->size - buffer->size_written; 66c76d4239SHadi Asyrafi current_buffer++; 67c76d4239SHadi Asyrafi current_buffer %= FPGA_CONFIG_BUFFER_SIZE; 68581182c1SSieu Mun Tang } else { 69c76d4239SHadi Asyrafi args[2] = bytes_per_block; 70581182c1SSieu Mun Tang } 717c58fd4eSHadi Asyrafi 727c58fd4eSHadi Asyrafi buffer->size_written += args[2]; 73aad868b4SAbdul Halim, Muhammad Hadi Asyrafi mailbox_send_cmd_async(&send_id, MBOX_RECONFIG_DATA, args, 74d57318b7SAbdul Halim, Muhammad Hadi Asyrafi 3U, CMD_INDIRECT); 757c58fd4eSHadi Asyrafi 76c76d4239SHadi Asyrafi buffer->subblocks_sent++; 77c76d4239SHadi Asyrafi max_blocks--; 78c76d4239SHadi Asyrafi } 797c58fd4eSHadi Asyrafi 807c58fd4eSHadi Asyrafi return !max_blocks; 81c76d4239SHadi Asyrafi } 82c76d4239SHadi Asyrafi 83c76d4239SHadi Asyrafi static int intel_fpga_sdm_write_all(void) 84c76d4239SHadi Asyrafi { 85581182c1SSieu Mun Tang for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 867c58fd4eSHadi Asyrafi if (intel_fpga_sdm_write_buffer( 87581182c1SSieu Mun Tang &fpga_config_buffers[current_buffer])) { 887c58fd4eSHadi Asyrafi break; 89581182c1SSieu Mun Tang } 90581182c1SSieu Mun Tang } 91c76d4239SHadi Asyrafi return 0; 92c76d4239SHadi Asyrafi } 93c76d4239SHadi Asyrafi 94673afd6fSSieu Mun Tang static uint32_t intel_mailbox_fpga_config_isdone(void) 95c76d4239SHadi Asyrafi { 96dfdd38c2SHadi Asyrafi uint32_t ret; 97dfdd38c2SHadi Asyrafi 98673afd6fSSieu Mun Tang switch (request_type) { 99673afd6fSSieu Mun Tang case RECONFIGURATION: 100673afd6fSSieu Mun Tang ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, 101673afd6fSSieu Mun Tang true); 102673afd6fSSieu Mun Tang break; 103673afd6fSSieu Mun Tang case BITSTREAM_AUTH: 104673afd6fSSieu Mun Tang ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, 105673afd6fSSieu Mun Tang false); 106673afd6fSSieu Mun Tang break; 107673afd6fSSieu Mun Tang default: 108673afd6fSSieu Mun Tang ret = intel_mailbox_get_config_status(MBOX_CONFIG_STATUS, 109673afd6fSSieu Mun Tang false); 110673afd6fSSieu Mun Tang break; 11152cf9c2cSKris Chaplin } 1127c58fd4eSHadi Asyrafi 113e40910e2SAbdul Halim, Muhammad Hadi Asyrafi if (ret != 0U) { 11452cf9c2cSKris Chaplin if (ret == MBOX_CFGSTAT_STATE_CONFIG) { 1157c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_BUSY; 11652cf9c2cSKris Chaplin } else { 117673afd6fSSieu Mun Tang request_type = NO_REQUEST; 1187c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 1197c58fd4eSHadi Asyrafi } 12052cf9c2cSKris Chaplin } 1217c58fd4eSHadi Asyrafi 122673afd6fSSieu Mun Tang if (bridge_disable != 0U) { 12311f4f030SSieu Mun Tang socfpga_bridges_enable(~0); /* Enable bridge */ 124276a4366SSieu Mun Tang bridge_disable = false; 1259c8f3af5SHadi Asyrafi } 126673afd6fSSieu Mun Tang request_type = NO_REQUEST; 1279c8f3af5SHadi Asyrafi 1287c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 129c76d4239SHadi Asyrafi } 130c76d4239SHadi Asyrafi 131c76d4239SHadi Asyrafi static int mark_last_buffer_xfer_completed(uint32_t *buffer_addr_completed) 132c76d4239SHadi Asyrafi { 133c76d4239SHadi Asyrafi int i; 134c76d4239SHadi Asyrafi 135c76d4239SHadi Asyrafi for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 136c76d4239SHadi Asyrafi if (fpga_config_buffers[i].block_number == current_block) { 137c76d4239SHadi Asyrafi fpga_config_buffers[i].subblocks_sent--; 138c76d4239SHadi Asyrafi if (fpga_config_buffers[i].subblocks_sent == 0 139c76d4239SHadi Asyrafi && fpga_config_buffers[i].size <= 140c76d4239SHadi Asyrafi fpga_config_buffers[i].size_written) { 141c76d4239SHadi Asyrafi fpga_config_buffers[i].write_requested = 0; 142c76d4239SHadi Asyrafi current_block++; 143c76d4239SHadi Asyrafi *buffer_addr_completed = 144c76d4239SHadi Asyrafi fpga_config_buffers[i].addr; 145c76d4239SHadi Asyrafi return 0; 146c76d4239SHadi Asyrafi } 147c76d4239SHadi Asyrafi } 148c76d4239SHadi Asyrafi } 149c76d4239SHadi Asyrafi 150c76d4239SHadi Asyrafi return -1; 151c76d4239SHadi Asyrafi } 152c76d4239SHadi Asyrafi 153e5ebe87bSHadi Asyrafi static int intel_fpga_config_completed_write(uint32_t *completed_addr, 154aad868b4SAbdul Halim, Muhammad Hadi Asyrafi uint32_t *count, uint32_t *job_id) 155c76d4239SHadi Asyrafi { 156c76d4239SHadi Asyrafi uint32_t resp[5]; 157a250c04bSSieu Mun Tang unsigned int resp_len = ARRAY_SIZE(resp); 158a250c04bSSieu Mun Tang int status = INTEL_SIP_SMC_STATUS_OK; 159c76d4239SHadi Asyrafi int all_completed = 1; 160a250c04bSSieu Mun Tang *count = 0; 161c76d4239SHadi Asyrafi 162cefb37ebSTien Hock, Loh while (*count < 3) { 163c76d4239SHadi Asyrafi 164a250c04bSSieu Mun Tang status = mailbox_read_response(job_id, 165a250c04bSSieu Mun Tang resp, &resp_len); 166c76d4239SHadi Asyrafi 167286b96f4SSieu Mun Tang if (status < 0) { 168cefb37ebSTien Hock, Loh break; 169286b96f4SSieu Mun Tang } 170c76d4239SHadi Asyrafi 171c76d4239SHadi Asyrafi max_blocks++; 172cefb37ebSTien Hock, Loh 173c76d4239SHadi Asyrafi if (mark_last_buffer_xfer_completed( 174286b96f4SSieu Mun Tang &completed_addr[*count]) == 0) { 175c76d4239SHadi Asyrafi *count = *count + 1; 176286b96f4SSieu Mun Tang } else { 177c76d4239SHadi Asyrafi break; 178c76d4239SHadi Asyrafi } 179286b96f4SSieu Mun Tang } 180c76d4239SHadi Asyrafi 181c76d4239SHadi Asyrafi if (*count <= 0) { 182286b96f4SSieu Mun Tang if (status != MBOX_NO_RESPONSE && 183286b96f4SSieu Mun Tang status != MBOX_TIMEOUT && resp_len != 0) { 184cefb37ebSTien Hock, Loh mailbox_clear_response(); 185673afd6fSSieu Mun Tang request_type = NO_REQUEST; 186c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 187c76d4239SHadi Asyrafi } 188c76d4239SHadi Asyrafi 189c76d4239SHadi Asyrafi *count = 0; 190c76d4239SHadi Asyrafi } 191c76d4239SHadi Asyrafi 192c76d4239SHadi Asyrafi intel_fpga_sdm_write_all(); 193c76d4239SHadi Asyrafi 194581182c1SSieu Mun Tang if (*count > 0) { 195c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_OK; 196581182c1SSieu Mun Tang } else if (*count == 0) { 197c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_BUSY; 198581182c1SSieu Mun Tang } 199c76d4239SHadi Asyrafi 200c76d4239SHadi Asyrafi for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 201c76d4239SHadi Asyrafi if (fpga_config_buffers[i].write_requested != 0) { 202c76d4239SHadi Asyrafi all_completed = 0; 203c76d4239SHadi Asyrafi break; 204c76d4239SHadi Asyrafi } 205c76d4239SHadi Asyrafi } 206c76d4239SHadi Asyrafi 207581182c1SSieu Mun Tang if (all_completed == 1) { 208c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 209581182c1SSieu Mun Tang } 210c76d4239SHadi Asyrafi 211c76d4239SHadi Asyrafi return status; 212c76d4239SHadi Asyrafi } 213c76d4239SHadi Asyrafi 214276a4366SSieu Mun Tang static int intel_fpga_config_start(uint32_t flag) 215c76d4239SHadi Asyrafi { 216a250c04bSSieu Mun Tang uint32_t argument = 0x1; 217c76d4239SHadi Asyrafi uint32_t response[3]; 218c76d4239SHadi Asyrafi int status = 0; 219a250c04bSSieu Mun Tang unsigned int size = 0; 220a250c04bSSieu Mun Tang unsigned int resp_len = ARRAY_SIZE(response); 221c76d4239SHadi Asyrafi 222673afd6fSSieu Mun Tang request_type = RECONFIGURATION; 223673afd6fSSieu Mun Tang 224276a4366SSieu Mun Tang if (!CONFIG_TEST_FLAG(flag, PARTIAL_CONFIG)) { 225276a4366SSieu Mun Tang bridge_disable = true; 226276a4366SSieu Mun Tang } 227276a4366SSieu Mun Tang 228276a4366SSieu Mun Tang if (CONFIG_TEST_FLAG(flag, AUTHENTICATION)) { 229276a4366SSieu Mun Tang size = 1; 230276a4366SSieu Mun Tang bridge_disable = false; 231673afd6fSSieu Mun Tang request_type = BITSTREAM_AUTH; 232ec4f28ecSAbdul Halim, Muhammad Hadi Asyrafi } 2339c8f3af5SHadi Asyrafi 234b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 235b727664eSSieu Mun Tang intel_smmu_hps_remapper_init(0U); 236b727664eSSieu Mun Tang #endif 237b727664eSSieu Mun Tang 238cefb37ebSTien Hock, Loh mailbox_clear_response(); 239cefb37ebSTien Hock, Loh 240a250c04bSSieu Mun Tang mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_CANCEL, NULL, 0U, 241a250c04bSSieu Mun Tang CMD_CASUAL, NULL, NULL); 242cefb37ebSTien Hock, Loh 243a250c04bSSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_RECONFIG, &argument, size, 244a250c04bSSieu Mun Tang CMD_CASUAL, response, &resp_len); 245c76d4239SHadi Asyrafi 246e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi if (status < 0) { 247276a4366SSieu Mun Tang bridge_disable = false; 248673afd6fSSieu Mun Tang request_type = NO_REQUEST; 249e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 250e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi } 251c76d4239SHadi Asyrafi 252c76d4239SHadi Asyrafi max_blocks = response[0]; 253c76d4239SHadi Asyrafi bytes_per_block = response[1]; 254c76d4239SHadi Asyrafi 255c76d4239SHadi Asyrafi for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 256c76d4239SHadi Asyrafi fpga_config_buffers[i].size = 0; 257c76d4239SHadi Asyrafi fpga_config_buffers[i].size_written = 0; 258c76d4239SHadi Asyrafi fpga_config_buffers[i].addr = 0; 259c76d4239SHadi Asyrafi fpga_config_buffers[i].write_requested = 0; 260c76d4239SHadi Asyrafi fpga_config_buffers[i].block_number = 0; 261c76d4239SHadi Asyrafi fpga_config_buffers[i].subblocks_sent = 0; 262c76d4239SHadi Asyrafi } 263c76d4239SHadi Asyrafi 264c76d4239SHadi Asyrafi blocks_submitted = 0; 265c76d4239SHadi Asyrafi current_block = 0; 266cefb37ebSTien Hock, Loh read_block = 0; 267c76d4239SHadi Asyrafi current_buffer = 0; 268c76d4239SHadi Asyrafi 269276a4366SSieu Mun Tang /* Disable bridge on full reconfiguration */ 270276a4366SSieu Mun Tang if (bridge_disable) { 27111f4f030SSieu Mun Tang socfpga_bridges_disable(~0); 2729c8f3af5SHadi Asyrafi } 2739c8f3af5SHadi Asyrafi 274e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 275c76d4239SHadi Asyrafi } 276c76d4239SHadi Asyrafi 2777c58fd4eSHadi Asyrafi static bool is_fpga_config_buffer_full(void) 2787c58fd4eSHadi Asyrafi { 279581182c1SSieu Mun Tang for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 280581182c1SSieu Mun Tang if (!fpga_config_buffers[i].write_requested) { 2817c58fd4eSHadi Asyrafi return false; 282581182c1SSieu Mun Tang } 283581182c1SSieu Mun Tang } 2847c58fd4eSHadi Asyrafi return true; 2857c58fd4eSHadi Asyrafi } 2867c58fd4eSHadi Asyrafi 287aad868b4SAbdul Halim, Muhammad Hadi Asyrafi bool is_address_in_ddr_range(uint64_t addr, uint64_t size) 2887c58fd4eSHadi Asyrafi { 289f4aaa9fdSSieu Mun Tang uint128_t dram_max_sz = (uint128_t)DRAM_BASE + (uint128_t)DRAM_SIZE; 290f4aaa9fdSSieu Mun Tang uint128_t dram_region_end = (uint128_t)addr + (uint128_t)size; 291f4aaa9fdSSieu Mun Tang 29212d71ac6SAbdul Halim, Muhammad Hadi Asyrafi if (!addr && !size) { 29312d71ac6SAbdul Halim, Muhammad Hadi Asyrafi return true; 29412d71ac6SAbdul Halim, Muhammad Hadi Asyrafi } 295581182c1SSieu Mun Tang if (size > (UINT64_MAX - addr)) { 2967c58fd4eSHadi Asyrafi return false; 297581182c1SSieu Mun Tang } 298581182c1SSieu Mun Tang if (addr < BL31_LIMIT) { 2991a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return false; 300581182c1SSieu Mun Tang } 301f4aaa9fdSSieu Mun Tang if (dram_region_end > dram_max_sz) { 3021a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return false; 303581182c1SSieu Mun Tang } 3041a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 3051a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return true; 3067c58fd4eSHadi Asyrafi } 307c76d4239SHadi Asyrafi 308e5ebe87bSHadi Asyrafi static uint32_t intel_fpga_config_write(uint64_t mem, uint64_t size) 309c76d4239SHadi Asyrafi { 3107c58fd4eSHadi Asyrafi int i; 311c76d4239SHadi Asyrafi 3127c58fd4eSHadi Asyrafi intel_fpga_sdm_write_all(); 313c76d4239SHadi Asyrafi 3141a87db5dSAbdul Halim, Muhammad Hadi Asyrafi if (!is_address_in_ddr_range(mem, size) || 315ef51b097SAbdul Halim, Muhammad Hadi Asyrafi is_fpga_config_buffer_full()) { 3167c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_REJECTED; 317ef51b097SAbdul Halim, Muhammad Hadi Asyrafi } 318c76d4239SHadi Asyrafi 319b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 320b727664eSSieu Mun Tang intel_smmu_hps_remapper_init(&mem); 321b727664eSSieu Mun Tang #endif 322b727664eSSieu Mun Tang 323c76d4239SHadi Asyrafi for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 3247c58fd4eSHadi Asyrafi int j = (i + current_buffer) % FPGA_CONFIG_BUFFER_SIZE; 3257c58fd4eSHadi Asyrafi 3267c58fd4eSHadi Asyrafi if (!fpga_config_buffers[j].write_requested) { 3277c58fd4eSHadi Asyrafi fpga_config_buffers[j].addr = mem; 3287c58fd4eSHadi Asyrafi fpga_config_buffers[j].size = size; 3297c58fd4eSHadi Asyrafi fpga_config_buffers[j].size_written = 0; 3307c58fd4eSHadi Asyrafi fpga_config_buffers[j].write_requested = 1; 3317c58fd4eSHadi Asyrafi fpga_config_buffers[j].block_number = 332c76d4239SHadi Asyrafi blocks_submitted++; 3337c58fd4eSHadi Asyrafi fpga_config_buffers[j].subblocks_sent = 0; 334c76d4239SHadi Asyrafi break; 335c76d4239SHadi Asyrafi } 336c76d4239SHadi Asyrafi } 337c76d4239SHadi Asyrafi 338ef51b097SAbdul Halim, Muhammad Hadi Asyrafi if (is_fpga_config_buffer_full()) { 3397c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_BUSY; 340ef51b097SAbdul Halim, Muhammad Hadi Asyrafi } 341c76d4239SHadi Asyrafi 3427c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 343c76d4239SHadi Asyrafi } 344c76d4239SHadi Asyrafi 34513d33d52SHadi Asyrafi static int is_out_of_sec_range(uint64_t reg_addr) 34613d33d52SHadi Asyrafi { 3477e954dfcSSiew Chin Lim #if DEBUG 3487e954dfcSSiew Chin Lim return 0; 3497e954dfcSSiew Chin Lim #endif 3507e954dfcSSiew Chin Lim 3518e59b9f4SJit Loon Lim #if PLATFORM_MODEL != PLAT_SOCFPGA_AGILEX5 35213d33d52SHadi Asyrafi switch (reg_addr) { 35313d33d52SHadi Asyrafi case(0xF8011100): /* ECCCTRL1 */ 35413d33d52SHadi Asyrafi case(0xF8011104): /* ECCCTRL2 */ 35513d33d52SHadi Asyrafi case(0xF8011110): /* ERRINTEN */ 35613d33d52SHadi Asyrafi case(0xF8011114): /* ERRINTENS */ 35713d33d52SHadi Asyrafi case(0xF8011118): /* ERRINTENR */ 35813d33d52SHadi Asyrafi case(0xF801111C): /* INTMODE */ 35913d33d52SHadi Asyrafi case(0xF8011120): /* INTSTAT */ 36013d33d52SHadi Asyrafi case(0xF8011124): /* DIAGINTTEST */ 36113d33d52SHadi Asyrafi case(0xF801112C): /* DERRADDRA */ 3624687021dSSieu Mun Tang case(0xFA000000): /* SMMU SCR0 */ 3634687021dSSieu Mun Tang case(0xFA000004): /* SMMU SCR1 */ 3644687021dSSieu Mun Tang case(0xFA000400): /* SMMU NSCR0 */ 3654687021dSSieu Mun Tang case(0xFA004000): /* SMMU SSD0_REG */ 3664687021dSSieu Mun Tang case(0xFA000820): /* SMMU SMR8 */ 3674687021dSSieu Mun Tang case(0xFA000c20): /* SMMU SCR8 */ 3684687021dSSieu Mun Tang case(0xFA028000): /* SMMU CB8_SCTRL */ 3694687021dSSieu Mun Tang case(0xFA001020): /* SMMU CBAR8 */ 3704687021dSSieu Mun Tang case(0xFA028030): /* SMMU TCR_LPAE */ 3714687021dSSieu Mun Tang case(0xFA028020): /* SMMU CB8_TTBR0_LOW */ 3724687021dSSieu Mun Tang case(0xFA028024): /* SMMU CB8_PRRR_HIGH */ 3734687021dSSieu Mun Tang case(0xFA028038): /* SMMU CB8_PRRR_MIR0 */ 3744687021dSSieu Mun Tang case(0xFA02803C): /* SMMU CB8_PRRR_MIR1 */ 3754687021dSSieu Mun Tang case(0xFA028010): /* SMMU_CB8)TCR2 */ 3764687021dSSieu Mun Tang case(0xFFD080A4): /* SDM SMMU STREAM ID REG */ 3774687021dSSieu Mun Tang case(0xFA001820): /* SMMU_CBA2R8 */ 3784687021dSSieu Mun Tang case(0xFA000074): /* SMMU_STLBGSTATUS */ 3794687021dSSieu Mun Tang case(0xFA0287F4): /* SMMU_CB8_TLBSTATUS */ 3804687021dSSieu Mun Tang case(0xFA000060): /* SMMU_STLBIALL */ 3814687021dSSieu Mun Tang case(0xFA000070): /* SMMU_STLBGSYNC */ 3824687021dSSieu Mun Tang case(0xFA028618): /* CB8_TLBALL */ 3834687021dSSieu Mun Tang case(0xFA0287F0): /* CB8_TLBSYNC */ 38413d33d52SHadi Asyrafi case(0xFFD12028): /* SDMMCGRP_CTRL */ 38513d33d52SHadi Asyrafi case(0xFFD12044): /* EMAC0 */ 38613d33d52SHadi Asyrafi case(0xFFD12048): /* EMAC1 */ 38713d33d52SHadi Asyrafi case(0xFFD1204C): /* EMAC2 */ 38813d33d52SHadi Asyrafi case(0xFFD12090): /* ECC_INT_MASK_VALUE */ 38913d33d52SHadi Asyrafi case(0xFFD12094): /* ECC_INT_MASK_SET */ 39013d33d52SHadi Asyrafi case(0xFFD12098): /* ECC_INT_MASK_CLEAR */ 39113d33d52SHadi Asyrafi case(0xFFD1209C): /* ECC_INTSTATUS_SERR */ 39213d33d52SHadi Asyrafi case(0xFFD120A0): /* ECC_INTSTATUS_DERR */ 39313d33d52SHadi Asyrafi case(0xFFD120C0): /* NOC_TIMEOUT */ 39413d33d52SHadi Asyrafi case(0xFFD120C4): /* NOC_IDLEREQ_SET */ 39513d33d52SHadi Asyrafi case(0xFFD120C8): /* NOC_IDLEREQ_CLR */ 39613d33d52SHadi Asyrafi case(0xFFD120D0): /* NOC_IDLEACK */ 39713d33d52SHadi Asyrafi case(0xFFD120D4): /* NOC_IDLESTATUS */ 39813d33d52SHadi Asyrafi case(0xFFD12200): /* BOOT_SCRATCH_COLD0 */ 39913d33d52SHadi Asyrafi case(0xFFD12204): /* BOOT_SCRATCH_COLD1 */ 40013d33d52SHadi Asyrafi case(0xFFD12220): /* BOOT_SCRATCH_COLD8 */ 40113d33d52SHadi Asyrafi case(0xFFD12224): /* BOOT_SCRATCH_COLD9 */ 40213d33d52SHadi Asyrafi return 0; 4038e59b9f4SJit Loon Lim #else 4048e59b9f4SJit Loon Lim switch (reg_addr) { 40513d33d52SHadi Asyrafi 4068e59b9f4SJit Loon Lim case(0xF8011104): /* ECCCTRL2 */ 4078e59b9f4SJit Loon Lim case(0xFFD12028): /* SDMMCGRP_CTRL */ 4088e59b9f4SJit Loon Lim case(0xFFD120C4): /* NOC_IDLEREQ_SET */ 4098e59b9f4SJit Loon Lim case(0xFFD120C8): /* NOC_IDLEREQ_CLR */ 4108e59b9f4SJit Loon Lim case(0xFFD120D0): /* NOC_IDLEACK */ 4118e59b9f4SJit Loon Lim 4128e59b9f4SJit Loon Lim 4138e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ECCCTRL1)): /* ECCCTRL1 */ 4148e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ERRINTEN)): /* ERRINTEN */ 4158e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ERRINTENS)): /* ERRINTENS */ 4168e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ERRINTENR)): /* ERRINTENR */ 4178e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(INTMODE)): /* INTMODE */ 4188e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(INTSTAT)): /* INTSTAT */ 4198e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(DIAGINTTEST)): /* DIAGINTTEST */ 4208e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(DERRADDRA)): /* DERRADDRA */ 4218e59b9f4SJit Loon Lim 422*46839460SJit Loon Lim case(SOCFPGA_ECC_QSPI(INITSTAT)): /* ECC_QSPI_INITSTAT */ 4238e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_0)): /* EMAC0 */ 4248e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_1)): /* EMAC1 */ 4258e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_2)): /* EMAC2 */ 4268e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_VALUE)): /* ECC_INT_MASK_VALUE */ 4278e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_SET)): /* ECC_INT_MASK_SET */ 4288e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_CLR)): /* ECC_INT_MASK_CLEAR */ 4298e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_SERR)): /* ECC_INTSTATUS_SERR */ 4308e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_DERR)): /* ECC_INTSTATUS_DERR */ 4318e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(NOC_TIMEOUT)): /* NOC_TIMEOUT */ 4328e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(NOC_IDLESTATUS)): /* NOC_IDLESTATUS */ 4338e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_0)): /* BOOT_SCRATCH_COLD0 */ 4348e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_1)): /* BOOT_SCRATCH_COLD1 */ 4358e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_8)): /* BOOT_SCRATCH_COLD8 */ 4368e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_9)): /* BOOT_SCRATCH_COLD9 */ 4378e59b9f4SJit Loon Lim #endif 4384d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(CTRL)): /* ECC_QSPI_CTRL */ 4394d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTEN)): /* ECC_QSPI_ERRINTEN */ 4404d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTENS)): /* ECC_QSPI_ERRINTENS */ 4414d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTENR)): /* ECC_QSPI_ERRINTENR */ 4424d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTMODE)): /* ECC_QSPI_INTMODE */ 4434d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_ACCCTRL)): /* ECC_QSPI_ECC_ACCCTRL */ 4444d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_STARTACC)): /* ECC_QSPI_ECC_STARTACC */ 4454d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_WDCTRL)): /* ECC_QSPI_ECC_WDCTRL */ 4464d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTSTAT)): /* ECC_QSPI_INTSTAT */ 4474d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTTEST)): /* ECC_QSPI_INTMODE */ 44813d33d52SHadi Asyrafi return 0; 449d6ae69c8SSieu Mun Tang 45013d33d52SHadi Asyrafi default: 45113d33d52SHadi Asyrafi break; 45213d33d52SHadi Asyrafi } 45313d33d52SHadi Asyrafi 45413d33d52SHadi Asyrafi return -1; 45513d33d52SHadi Asyrafi } 45613d33d52SHadi Asyrafi 45713d33d52SHadi Asyrafi /* Secure register access */ 45813d33d52SHadi Asyrafi uint32_t intel_secure_reg_read(uint64_t reg_addr, uint32_t *retval) 45913d33d52SHadi Asyrafi { 46013d33d52SHadi Asyrafi if (is_out_of_sec_range(reg_addr)) { 46113d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 46213d33d52SHadi Asyrafi } 46313d33d52SHadi Asyrafi 46413d33d52SHadi Asyrafi *retval = mmio_read_32(reg_addr); 46513d33d52SHadi Asyrafi 46613d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 46713d33d52SHadi Asyrafi } 46813d33d52SHadi Asyrafi 46913d33d52SHadi Asyrafi uint32_t intel_secure_reg_write(uint64_t reg_addr, uint32_t val, 47013d33d52SHadi Asyrafi uint32_t *retval) 47113d33d52SHadi Asyrafi { 47213d33d52SHadi Asyrafi if (is_out_of_sec_range(reg_addr)) { 47313d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 47413d33d52SHadi Asyrafi } 47513d33d52SHadi Asyrafi 4764d122e5fSJit Loon Lim switch (reg_addr) { 4774d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTSTAT)): /* ECC_QSPI_INTSTAT */ 4784d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTTEST)): /* ECC_QSPI_INTMODE */ 4794d122e5fSJit Loon Lim mmio_write_16(reg_addr, val); 4804d122e5fSJit Loon Lim break; 4814d122e5fSJit Loon Lim default: 48213d33d52SHadi Asyrafi mmio_write_32(reg_addr, val); 4834d122e5fSJit Loon Lim break; 4844d122e5fSJit Loon Lim } 48513d33d52SHadi Asyrafi 48613d33d52SHadi Asyrafi return intel_secure_reg_read(reg_addr, retval); 48713d33d52SHadi Asyrafi } 48813d33d52SHadi Asyrafi 48913d33d52SHadi Asyrafi uint32_t intel_secure_reg_update(uint64_t reg_addr, uint32_t mask, 49013d33d52SHadi Asyrafi uint32_t val, uint32_t *retval) 49113d33d52SHadi Asyrafi { 49213d33d52SHadi Asyrafi if (!intel_secure_reg_read(reg_addr, retval)) { 49313d33d52SHadi Asyrafi *retval &= ~mask; 494c9c07099SSiew Chin Lim *retval |= val & mask; 49513d33d52SHadi Asyrafi return intel_secure_reg_write(reg_addr, *retval, retval); 49613d33d52SHadi Asyrafi } 49713d33d52SHadi Asyrafi 49813d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 49913d33d52SHadi Asyrafi } 50013d33d52SHadi Asyrafi 501e1f97d9cSHadi Asyrafi /* Intel Remote System Update (RSU) services */ 502e1f97d9cSHadi Asyrafi uint64_t intel_rsu_update_address; 503e1f97d9cSHadi Asyrafi 504d57318b7SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_rsu_status(uint64_t *respbuf, unsigned int respbuf_sz) 505e1f97d9cSHadi Asyrafi { 506581182c1SSieu Mun Tang if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 507960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 508581182c1SSieu Mun Tang } 509e1f97d9cSHadi Asyrafi 510e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 511e1f97d9cSHadi Asyrafi } 512e1f97d9cSHadi Asyrafi 5138fb1b484SKah Jing Lee static uint32_t intel_rsu_get_device_info(uint32_t *respbuf, 5148fb1b484SKah Jing Lee unsigned int respbuf_sz) 5158fb1b484SKah Jing Lee { 5168fb1b484SKah Jing Lee if (mailbox_rsu_get_device_info((uint32_t *)respbuf, respbuf_sz) < 0) { 5178fb1b484SKah Jing Lee return INTEL_SIP_SMC_RSU_ERROR; 5188fb1b484SKah Jing Lee } 5198fb1b484SKah Jing Lee 5208fb1b484SKah Jing Lee return INTEL_SIP_SMC_STATUS_OK; 5218fb1b484SKah Jing Lee } 5228fb1b484SKah Jing Lee 523e3c3a48cSMahesh Rao uint32_t intel_rsu_update(uint64_t update_address) 524e1f97d9cSHadi Asyrafi { 525c418064eSJit Loon Lim if (update_address > SIZE_MAX) { 526c418064eSJit Loon Lim return INTEL_SIP_SMC_STATUS_REJECTED; 527c418064eSJit Loon Lim } 528c418064eSJit Loon Lim 529e1f97d9cSHadi Asyrafi intel_rsu_update_address = update_address; 530e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 531e1f97d9cSHadi Asyrafi } 532e1f97d9cSHadi Asyrafi 533ea9b9627SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_rsu_notify(uint32_t execution_stage) 534e1f97d9cSHadi Asyrafi { 535581182c1SSieu Mun Tang if (mailbox_hps_stage_notify(execution_stage) < 0) { 536960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 537581182c1SSieu Mun Tang } 538e1f97d9cSHadi Asyrafi 539e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 540e1f97d9cSHadi Asyrafi } 541e1f97d9cSHadi Asyrafi 542e1f97d9cSHadi Asyrafi static uint32_t intel_rsu_retry_counter(uint32_t *respbuf, uint32_t respbuf_sz, 543e1f97d9cSHadi Asyrafi uint32_t *ret_stat) 544e1f97d9cSHadi Asyrafi { 545581182c1SSieu Mun Tang if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 546960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 547581182c1SSieu Mun Tang } 548e1f97d9cSHadi Asyrafi 549e1f97d9cSHadi Asyrafi *ret_stat = respbuf[8]; 550e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 551e1f97d9cSHadi Asyrafi } 552e1f97d9cSHadi Asyrafi 55344eb782eSChee Hong Ang static uint32_t intel_rsu_copy_dcmf_version(uint64_t dcmf_ver_1_0, 55444eb782eSChee Hong Ang uint64_t dcmf_ver_3_2) 55544eb782eSChee Hong Ang { 55644eb782eSChee Hong Ang rsu_dcmf_ver[0] = dcmf_ver_1_0; 55744eb782eSChee Hong Ang rsu_dcmf_ver[1] = dcmf_ver_1_0 >> 32; 55844eb782eSChee Hong Ang rsu_dcmf_ver[2] = dcmf_ver_3_2; 55944eb782eSChee Hong Ang rsu_dcmf_ver[3] = dcmf_ver_3_2 >> 32; 56044eb782eSChee Hong Ang 56144eb782eSChee Hong Ang return INTEL_SIP_SMC_STATUS_OK; 56244eb782eSChee Hong Ang } 56344eb782eSChee Hong Ang 564984e236eSSieu Mun Tang static uint32_t intel_rsu_copy_dcmf_status(uint64_t dcmf_stat) 565984e236eSSieu Mun Tang { 566984e236eSSieu Mun Tang rsu_dcmf_stat[0] = 0xFFFF & (dcmf_stat >> (0 * 16)); 567984e236eSSieu Mun Tang rsu_dcmf_stat[1] = 0xFFFF & (dcmf_stat >> (1 * 16)); 568984e236eSSieu Mun Tang rsu_dcmf_stat[2] = 0xFFFF & (dcmf_stat >> (2 * 16)); 569984e236eSSieu Mun Tang rsu_dcmf_stat[3] = 0xFFFF & (dcmf_stat >> (3 * 16)); 570984e236eSSieu Mun Tang 571984e236eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 572984e236eSSieu Mun Tang } 573984e236eSSieu Mun Tang 57452cf9c2cSKris Chaplin /* Intel HWMON services */ 57552cf9c2cSKris Chaplin static uint32_t intel_hwmon_readtemp(uint32_t chan, uint32_t *retval) 57652cf9c2cSKris Chaplin { 57752cf9c2cSKris Chaplin if (mailbox_hwmon_readtemp(chan, retval) < 0) { 57852cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_ERROR; 57952cf9c2cSKris Chaplin } 58052cf9c2cSKris Chaplin 58152cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_OK; 58252cf9c2cSKris Chaplin } 58352cf9c2cSKris Chaplin 58452cf9c2cSKris Chaplin static uint32_t intel_hwmon_readvolt(uint32_t chan, uint32_t *retval) 58552cf9c2cSKris Chaplin { 58652cf9c2cSKris Chaplin if (mailbox_hwmon_readvolt(chan, retval) < 0) { 58752cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_ERROR; 58852cf9c2cSKris Chaplin } 58952cf9c2cSKris Chaplin 59052cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_OK; 59152cf9c2cSKris Chaplin } 59252cf9c2cSKris Chaplin 5930c5d62adSHadi Asyrafi /* Mailbox services */ 594c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_smc_fw_version(uint32_t *fw_version) 595c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi { 596c026dfe3SSieu Mun Tang int status; 597c026dfe3SSieu Mun Tang unsigned int resp_len = CONFIG_STATUS_WORD_SIZE; 598c026dfe3SSieu Mun Tang uint32_t resp_data[CONFIG_STATUS_WORD_SIZE] = {0U}; 599c026dfe3SSieu Mun Tang 600c026dfe3SSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CONFIG_STATUS, NULL, 0U, 601c026dfe3SSieu Mun Tang CMD_CASUAL, resp_data, &resp_len); 602c026dfe3SSieu Mun Tang 603c026dfe3SSieu Mun Tang if (status < 0) { 604c026dfe3SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 605c026dfe3SSieu Mun Tang } 606c026dfe3SSieu Mun Tang 607c026dfe3SSieu Mun Tang if (resp_len <= CONFIG_STATUS_FW_VER_OFFSET) { 608c026dfe3SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 609c026dfe3SSieu Mun Tang } 610c026dfe3SSieu Mun Tang 611c026dfe3SSieu Mun Tang *fw_version = resp_data[CONFIG_STATUS_FW_VER_OFFSET] & CONFIG_STATUS_FW_VER_MASK; 612c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 613c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 614c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi } 615c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 616a250c04bSSieu Mun Tang static uint32_t intel_mbox_send_cmd(uint32_t cmd, uint32_t *args, 617ac097fdfSSieu Mun Tang unsigned int len, uint32_t urgent, uint64_t response, 618a250c04bSSieu Mun Tang unsigned int resp_len, int *mbox_status, 619a250c04bSSieu Mun Tang unsigned int *len_in_resp) 6200c5d62adSHadi Asyrafi { 6211a87db5dSAbdul Halim, Muhammad Hadi Asyrafi *len_in_resp = 0; 622651841f2SSieu Mun Tang *mbox_status = GENERIC_RESPONSE_ERROR; 6231a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 624581182c1SSieu Mun Tang if (!is_address_in_ddr_range((uint64_t)args, sizeof(uint32_t) * len)) { 6251a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_REJECTED; 626581182c1SSieu Mun Tang } 6271a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 6280c5d62adSHadi Asyrafi int status = mailbox_send_cmd(MBOX_JOB_ID, cmd, args, len, urgent, 629ac097fdfSSieu Mun Tang (uint32_t *) response, &resp_len); 6300c5d62adSHadi Asyrafi 6310c5d62adSHadi Asyrafi if (status < 0) { 6320c5d62adSHadi Asyrafi *mbox_status = -status; 6330c5d62adSHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 6340c5d62adSHadi Asyrafi } 6350c5d62adSHadi Asyrafi 6360c5d62adSHadi Asyrafi *mbox_status = 0; 637a250c04bSSieu Mun Tang *len_in_resp = resp_len; 638ac097fdfSSieu Mun Tang 639ac097fdfSSieu Mun Tang flush_dcache_range(response, resp_len * MBOX_WORD_BYTE); 640ac097fdfSSieu Mun Tang 6410c5d62adSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 6420c5d62adSHadi Asyrafi } 6430c5d62adSHadi Asyrafi 64493a5b97eSSieu Mun Tang static int intel_smc_get_usercode(uint32_t *user_code) 64593a5b97eSSieu Mun Tang { 64693a5b97eSSieu Mun Tang int status; 64793a5b97eSSieu Mun Tang unsigned int resp_len = sizeof(user_code) / MBOX_WORD_BYTE; 64893a5b97eSSieu Mun Tang 64993a5b97eSSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_GET_USERCODE, NULL, 65093a5b97eSSieu Mun Tang 0U, CMD_CASUAL, user_code, &resp_len); 65193a5b97eSSieu Mun Tang 65293a5b97eSSieu Mun Tang if (status < 0) { 65393a5b97eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 65493a5b97eSSieu Mun Tang } 65593a5b97eSSieu Mun Tang 65693a5b97eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 65793a5b97eSSieu Mun Tang } 65893a5b97eSSieu Mun Tang 6594837a640SSieu Mun Tang uint32_t intel_smc_service_completed(uint64_t addr, uint32_t size, 6604837a640SSieu Mun Tang uint32_t mode, uint32_t *job_id, 6614837a640SSieu Mun Tang uint32_t *ret_size, uint32_t *mbox_error) 6624837a640SSieu Mun Tang { 6634837a640SSieu Mun Tang int status = 0; 6644837a640SSieu Mun Tang uint32_t resp_len = size / MBOX_WORD_BYTE; 6654837a640SSieu Mun Tang 6664837a640SSieu Mun Tang if (resp_len > MBOX_DATA_MAX_LEN) { 6674837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_REJECTED; 6684837a640SSieu Mun Tang } 6694837a640SSieu Mun Tang 6704837a640SSieu Mun Tang if (!is_address_in_ddr_range(addr, size)) { 6714837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_REJECTED; 6724837a640SSieu Mun Tang } 6734837a640SSieu Mun Tang 6744837a640SSieu Mun Tang if (mode == SERVICE_COMPLETED_MODE_ASYNC) { 6754837a640SSieu Mun Tang status = mailbox_read_response_async(job_id, 6764837a640SSieu Mun Tang NULL, (uint32_t *) addr, &resp_len, 0); 6774837a640SSieu Mun Tang } else { 6784837a640SSieu Mun Tang status = mailbox_read_response(job_id, 6794837a640SSieu Mun Tang (uint32_t *) addr, &resp_len); 6804837a640SSieu Mun Tang 6814837a640SSieu Mun Tang if (status == MBOX_NO_RESPONSE) { 6824837a640SSieu Mun Tang status = MBOX_BUSY; 6834837a640SSieu Mun Tang } 6844837a640SSieu Mun Tang } 6854837a640SSieu Mun Tang 6864837a640SSieu Mun Tang if (status == MBOX_NO_RESPONSE) { 6874837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_NO_RESPONSE; 6884837a640SSieu Mun Tang } 6894837a640SSieu Mun Tang 6904837a640SSieu Mun Tang if (status == MBOX_BUSY) { 6914837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_BUSY; 6924837a640SSieu Mun Tang } 6934837a640SSieu Mun Tang 6944837a640SSieu Mun Tang *ret_size = resp_len * MBOX_WORD_BYTE; 6954837a640SSieu Mun Tang flush_dcache_range(addr, *ret_size); 6964837a640SSieu Mun Tang 69776ed3223SSieu Mun Tang if (status == MBOX_RET_SDOS_DECRYPTION_ERROR_102 || 69876ed3223SSieu Mun Tang status == MBOX_RET_SDOS_DECRYPTION_ERROR_103) { 69976ed3223SSieu Mun Tang *mbox_error = -status; 70076ed3223SSieu Mun Tang } else if (status != MBOX_RET_OK) { 7014837a640SSieu Mun Tang *mbox_error = -status; 7024837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 7034837a640SSieu Mun Tang } 7044837a640SSieu Mun Tang 7054837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 7064837a640SSieu Mun Tang } 7074837a640SSieu Mun Tang 708b703facaSSieu Mun Tang /* Miscellaneous HPS services */ 709b703facaSSieu Mun Tang uint32_t intel_hps_set_bridges(uint64_t enable, uint64_t mask) 710b703facaSSieu Mun Tang { 711b703facaSSieu Mun Tang int status = 0; 712b703facaSSieu Mun Tang 713ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_ENABLE) != 0U) { 714ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 715b703facaSSieu Mun Tang status = socfpga_bridges_enable((uint32_t)mask); 716b703facaSSieu Mun Tang } else { 717b703facaSSieu Mun Tang status = socfpga_bridges_enable(~0); 718b703facaSSieu Mun Tang } 719b703facaSSieu Mun Tang } else { 720ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 721b703facaSSieu Mun Tang status = socfpga_bridges_disable((uint32_t)mask); 722b703facaSSieu Mun Tang } else { 723b703facaSSieu Mun Tang status = socfpga_bridges_disable(~0); 724b703facaSSieu Mun Tang } 725b703facaSSieu Mun Tang } 726b703facaSSieu Mun Tang 727b703facaSSieu Mun Tang if (status < 0) { 728b703facaSSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 729b703facaSSieu Mun Tang } 730b703facaSSieu Mun Tang 731b703facaSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 732b703facaSSieu Mun Tang } 733b703facaSSieu Mun Tang 73491239f2cSJit Loon Lim /* SDM SEU Error services */ 735fffcb25cSJit Loon Lim static uint32_t intel_sdm_seu_err_read(uint32_t *respbuf, unsigned int respbuf_sz) 73691239f2cSJit Loon Lim { 737fffcb25cSJit Loon Lim if (mailbox_seu_err_status(respbuf, respbuf_sz) < 0) { 738fffcb25cSJit Loon Lim return INTEL_SIP_SMC_SEU_ERR_READ_ERROR; 739fffcb25cSJit Loon Lim } 740fffcb25cSJit Loon Lim 741fffcb25cSJit Loon Lim return INTEL_SIP_SMC_STATUS_OK; 742fffcb25cSJit Loon Lim } 743fffcb25cSJit Loon Lim 744fffcb25cSJit Loon Lim /* SDM SAFE SEU Error inject services */ 745fffcb25cSJit Loon Lim static uint32_t intel_sdm_safe_inject_seu_err(uint32_t *command, uint32_t len) 746fffcb25cSJit Loon Lim { 747fffcb25cSJit Loon Lim if (mailbox_safe_inject_seu_err(command, len) < 0) { 74891239f2cSJit Loon Lim return INTEL_SIP_SMC_SEU_ERR_READ_ERROR; 74991239f2cSJit Loon Lim } 75091239f2cSJit Loon Lim 75191239f2cSJit Loon Lim return INTEL_SIP_SMC_STATUS_OK; 75291239f2cSJit Loon Lim } 75391239f2cSJit Loon Lim 754b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 755b727664eSSieu Mun Tang /* SMMU HPS Remapper */ 756b727664eSSieu Mun Tang void intel_smmu_hps_remapper_init(uint64_t *mem) 757b727664eSSieu Mun Tang { 758b727664eSSieu Mun Tang /* Read out Bit 1 value */ 759b727664eSSieu Mun Tang uint32_t remap = (mmio_read_32(SOCFPGA_SYSMGR(BOOT_SCRATCH_POR_1)) & 0x02); 760b727664eSSieu Mun Tang 761b727664eSSieu Mun Tang if (remap == 0x00) { 762b727664eSSieu Mun Tang /* Update DRAM Base address for SDM SMMU */ 763b727664eSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_ARADDR_REMAP), DRAM_BASE); 764b727664eSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_AWADDR_REMAP), DRAM_BASE); 765b727664eSSieu Mun Tang *mem = *mem - DRAM_BASE; 766b727664eSSieu Mun Tang } else { 767b727664eSSieu Mun Tang *mem = *mem - DRAM_BASE; 768b727664eSSieu Mun Tang } 769b727664eSSieu Mun Tang } 770b727664eSSieu Mun Tang #endif 771b727664eSSieu Mun Tang 772c76d4239SHadi Asyrafi /* 773c76d4239SHadi Asyrafi * This function is responsible for handling all SiP calls from the NS world 774c76d4239SHadi Asyrafi */ 775c76d4239SHadi Asyrafi 776ad47f142SSieu Mun Tang uintptr_t sip_smc_handler_v1(uint32_t smc_fid, 777c76d4239SHadi Asyrafi u_register_t x1, 778c76d4239SHadi Asyrafi u_register_t x2, 779c76d4239SHadi Asyrafi u_register_t x3, 780c76d4239SHadi Asyrafi u_register_t x4, 781c76d4239SHadi Asyrafi void *cookie, 782c76d4239SHadi Asyrafi void *handle, 783c76d4239SHadi Asyrafi u_register_t flags) 784c76d4239SHadi Asyrafi { 785d1740831SSieu Mun Tang uint32_t retval = 0, completed_addr[3]; 786d1740831SSieu Mun Tang uint32_t retval2 = 0; 78777902fcaSSieu Mun Tang uint32_t mbox_error = 0; 788fffcb25cSJit Loon Lim uint64_t retval64, rsu_respbuf[9]; 789fffcb25cSJit Loon Lim uint32_t seu_respbuf[3]; 790286b96f4SSieu Mun Tang int status = INTEL_SIP_SMC_STATUS_OK; 791a250c04bSSieu Mun Tang int mbox_status; 792a250c04bSSieu Mun Tang unsigned int len_in_resp; 793c05ea296SSieu Mun Tang u_register_t x5, x6, x7; 794f8e6a09cSAbdul Halim, Muhammad Hadi Asyrafi 795c76d4239SHadi Asyrafi switch (smc_fid) { 796c76d4239SHadi Asyrafi case SIP_SVC_UID: 797c76d4239SHadi Asyrafi /* Return UID to the caller */ 798c76d4239SHadi Asyrafi SMC_UUID_RET(handle, intl_svc_uid); 79913d33d52SHadi Asyrafi 800c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_ISDONE: 801673afd6fSSieu Mun Tang status = intel_mailbox_fpga_config_isdone(); 802c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 80313d33d52SHadi Asyrafi 804c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM: 805c76d4239SHadi Asyrafi SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 806c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR, 807c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_SIZE - 808c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR); 80913d33d52SHadi Asyrafi 810c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_START: 811c76d4239SHadi Asyrafi status = intel_fpga_config_start(x1); 812c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 81313d33d52SHadi Asyrafi 814c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_WRITE: 815c76d4239SHadi Asyrafi status = intel_fpga_config_write(x1, x2); 816c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 81713d33d52SHadi Asyrafi 818c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE: 819c76d4239SHadi Asyrafi status = intel_fpga_config_completed_write(completed_addr, 820aad868b4SAbdul Halim, Muhammad Hadi Asyrafi &retval, &rcv_id); 821aad868b4SAbdul Halim, Muhammad Hadi Asyrafi switch (retval) { 822c76d4239SHadi Asyrafi case 1: 823c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 824c76d4239SHadi Asyrafi completed_addr[0], 0, 0); 82513d33d52SHadi Asyrafi 826c76d4239SHadi Asyrafi case 2: 827c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 828c76d4239SHadi Asyrafi completed_addr[0], 829c76d4239SHadi Asyrafi completed_addr[1], 0); 83013d33d52SHadi Asyrafi 831c76d4239SHadi Asyrafi case 3: 832c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 833c76d4239SHadi Asyrafi completed_addr[0], 834c76d4239SHadi Asyrafi completed_addr[1], 835c76d4239SHadi Asyrafi completed_addr[2]); 83613d33d52SHadi Asyrafi 837c76d4239SHadi Asyrafi case 0: 838c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 83913d33d52SHadi Asyrafi 840c76d4239SHadi Asyrafi default: 841cefb37ebSTien Hock, Loh mailbox_clear_response(); 842c76d4239SHadi Asyrafi SMC_RET1(handle, INTEL_SIP_SMC_STATUS_ERROR); 843c76d4239SHadi Asyrafi } 84413d33d52SHadi Asyrafi 84513d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_READ: 846aad868b4SAbdul Halim, Muhammad Hadi Asyrafi status = intel_secure_reg_read(x1, &retval); 847aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 84813d33d52SHadi Asyrafi 84913d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_WRITE: 850aad868b4SAbdul Halim, Muhammad Hadi Asyrafi status = intel_secure_reg_write(x1, (uint32_t)x2, &retval); 851aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 85213d33d52SHadi Asyrafi 85313d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_UPDATE: 85413d33d52SHadi Asyrafi status = intel_secure_reg_update(x1, (uint32_t)x2, 855aad868b4SAbdul Halim, Muhammad Hadi Asyrafi (uint32_t)x3, &retval); 856aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 857c76d4239SHadi Asyrafi 858e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_STATUS: 859e1f97d9cSHadi Asyrafi status = intel_rsu_status(rsu_respbuf, 860e1f97d9cSHadi Asyrafi ARRAY_SIZE(rsu_respbuf)); 861e1f97d9cSHadi Asyrafi if (status) { 862e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 863e1f97d9cSHadi Asyrafi } else { 864e1f97d9cSHadi Asyrafi SMC_RET4(handle, rsu_respbuf[0], rsu_respbuf[1], 865e1f97d9cSHadi Asyrafi rsu_respbuf[2], rsu_respbuf[3]); 866e1f97d9cSHadi Asyrafi } 867e1f97d9cSHadi Asyrafi 868e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_UPDATE: 869e1f97d9cSHadi Asyrafi status = intel_rsu_update(x1); 870e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 871e1f97d9cSHadi Asyrafi 872e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_NOTIFY: 873e1f97d9cSHadi Asyrafi status = intel_rsu_notify(x1); 874e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 875e1f97d9cSHadi Asyrafi 876e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_RETRY_COUNTER: 877e1f97d9cSHadi Asyrafi status = intel_rsu_retry_counter((uint32_t *)rsu_respbuf, 878aad868b4SAbdul Halim, Muhammad Hadi Asyrafi ARRAY_SIZE(rsu_respbuf), &retval); 879e1f97d9cSHadi Asyrafi if (status) { 880e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 881e1f97d9cSHadi Asyrafi } else { 882aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET2(handle, status, retval); 883e1f97d9cSHadi Asyrafi } 884e1f97d9cSHadi Asyrafi 88544eb782eSChee Hong Ang case INTEL_SIP_SMC_RSU_DCMF_VERSION: 88644eb782eSChee Hong Ang SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 88744eb782eSChee Hong Ang ((uint64_t)rsu_dcmf_ver[1] << 32) | rsu_dcmf_ver[0], 88844eb782eSChee Hong Ang ((uint64_t)rsu_dcmf_ver[3] << 32) | rsu_dcmf_ver[2]); 88944eb782eSChee Hong Ang 89044eb782eSChee Hong Ang case INTEL_SIP_SMC_RSU_COPY_DCMF_VERSION: 89144eb782eSChee Hong Ang status = intel_rsu_copy_dcmf_version(x1, x2); 89244eb782eSChee Hong Ang SMC_RET1(handle, status); 89344eb782eSChee Hong Ang 8948fb1b484SKah Jing Lee case INTEL_SIP_SMC_RSU_GET_DEVICE_INFO: 8958fb1b484SKah Jing Lee status = intel_rsu_get_device_info((uint32_t *)rsu_respbuf, 8968fb1b484SKah Jing Lee ARRAY_SIZE(rsu_respbuf)); 8978fb1b484SKah Jing Lee if (status) { 8988fb1b484SKah Jing Lee SMC_RET1(handle, status); 8998fb1b484SKah Jing Lee } else { 9008fb1b484SKah Jing Lee SMC_RET5(handle, status, rsu_respbuf[0], rsu_respbuf[1], 9018fb1b484SKah Jing Lee rsu_respbuf[2], rsu_respbuf[3]); 9028fb1b484SKah Jing Lee } 9038fb1b484SKah Jing Lee 904984e236eSSieu Mun Tang case INTEL_SIP_SMC_RSU_DCMF_STATUS: 905984e236eSSieu Mun Tang SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, 906984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[3] << 48) | 907984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[2] << 32) | 908984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[1] << 16) | 909984e236eSSieu Mun Tang rsu_dcmf_stat[0]); 910984e236eSSieu Mun Tang 911984e236eSSieu Mun Tang case INTEL_SIP_SMC_RSU_COPY_DCMF_STATUS: 912984e236eSSieu Mun Tang status = intel_rsu_copy_dcmf_status(x1); 913984e236eSSieu Mun Tang SMC_RET1(handle, status); 914984e236eSSieu Mun Tang 9154c26957bSChee Hong Ang case INTEL_SIP_SMC_RSU_MAX_RETRY: 9164c26957bSChee Hong Ang SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, rsu_max_retry); 9174c26957bSChee Hong Ang 9184c26957bSChee Hong Ang case INTEL_SIP_SMC_RSU_COPY_MAX_RETRY: 9194c26957bSChee Hong Ang rsu_max_retry = x1; 9204c26957bSChee Hong Ang SMC_RET1(handle, INTEL_SIP_SMC_STATUS_OK); 9214c26957bSChee Hong Ang 922c703d752SSieu Mun Tang case INTEL_SIP_SMC_ECC_DBE: 923c703d752SSieu Mun Tang status = intel_ecc_dbe_notification(x1); 924c703d752SSieu Mun Tang SMC_RET1(handle, status); 925c703d752SSieu Mun Tang 926b703facaSSieu Mun Tang case INTEL_SIP_SMC_SERVICE_COMPLETED: 927b703facaSSieu Mun Tang status = intel_smc_service_completed(x1, x2, x3, &rcv_id, 928b703facaSSieu Mun Tang &len_in_resp, &mbox_error); 929b703facaSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, len_in_resp); 930b703facaSSieu Mun Tang 931c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi case INTEL_SIP_SMC_FIRMWARE_VERSION: 932c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi status = intel_smc_fw_version(&retval); 933c026dfe3SSieu Mun Tang SMC_RET2(handle, status, retval); 934c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 9350c5d62adSHadi Asyrafi case INTEL_SIP_SMC_MBOX_SEND_CMD: 9360c5d62adSHadi Asyrafi x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 9370c5d62adSHadi Asyrafi x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 938ac097fdfSSieu Mun Tang status = intel_mbox_send_cmd(x1, (uint32_t *)x2, x3, x4, x5, x6, 939ac097fdfSSieu Mun Tang &mbox_status, &len_in_resp); 940108514ffSSieu Mun Tang SMC_RET3(handle, status, mbox_status, len_in_resp); 9410c5d62adSHadi Asyrafi 94293a5b97eSSieu Mun Tang case INTEL_SIP_SMC_GET_USERCODE: 94393a5b97eSSieu Mun Tang status = intel_smc_get_usercode(&retval); 94493a5b97eSSieu Mun Tang SMC_RET2(handle, status, retval); 94593a5b97eSSieu Mun Tang 94602d3ef33SSieu Mun Tang case INTEL_SIP_SMC_FCS_CRYPTION: 94702d3ef33SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 94802d3ef33SSieu Mun Tang 94902d3ef33SSieu Mun Tang if (x1 == FCS_MODE_DECRYPT) { 95002d3ef33SSieu Mun Tang status = intel_fcs_decryption(x2, x3, x4, x5, &send_id); 95102d3ef33SSieu Mun Tang } else if (x1 == FCS_MODE_ENCRYPT) { 95202d3ef33SSieu Mun Tang status = intel_fcs_encryption(x2, x3, x4, x5, &send_id); 95302d3ef33SSieu Mun Tang } else { 95402d3ef33SSieu Mun Tang status = INTEL_SIP_SMC_STATUS_REJECTED; 95502d3ef33SSieu Mun Tang } 95602d3ef33SSieu Mun Tang 95702d3ef33SSieu Mun Tang SMC_RET3(handle, status, x4, x5); 95802d3ef33SSieu Mun Tang 959537ff052SSieu Mun Tang case INTEL_SIP_SMC_FCS_CRYPTION_EXT: 960537ff052SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 961537ff052SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 962537ff052SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 963537ff052SSieu Mun Tang 964537ff052SSieu Mun Tang if (x3 == FCS_MODE_DECRYPT) { 965537ff052SSieu Mun Tang status = intel_fcs_decryption_ext(x1, x2, x4, x5, x6, 966537ff052SSieu Mun Tang (uint32_t *) &x7, &mbox_error); 967537ff052SSieu Mun Tang } else if (x3 == FCS_MODE_ENCRYPT) { 968537ff052SSieu Mun Tang status = intel_fcs_encryption_ext(x1, x2, x4, x5, x6, 969537ff052SSieu Mun Tang (uint32_t *) &x7, &mbox_error); 970537ff052SSieu Mun Tang } else { 971537ff052SSieu Mun Tang status = INTEL_SIP_SMC_STATUS_REJECTED; 972537ff052SSieu Mun Tang } 973537ff052SSieu Mun Tang 974537ff052SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x6, x7); 975537ff052SSieu Mun Tang 9764837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_RANDOM_NUMBER: 9774837a640SSieu Mun Tang status = intel_fcs_random_number_gen(x1, &retval64, 9784837a640SSieu Mun Tang &mbox_error); 9794837a640SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, retval64); 9804837a640SSieu Mun Tang 98124f9dc8aSSieu Mun Tang case INTEL_SIP_SMC_FCS_RANDOM_NUMBER_EXT: 98224f9dc8aSSieu Mun Tang status = intel_fcs_random_number_gen_ext(x1, x2, x3, 98324f9dc8aSSieu Mun Tang &send_id); 98424f9dc8aSSieu Mun Tang SMC_RET1(handle, status); 98524f9dc8aSSieu Mun Tang 9864837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_SEND_CERTIFICATE: 9874837a640SSieu Mun Tang status = intel_fcs_send_cert(x1, x2, &send_id); 9884837a640SSieu Mun Tang SMC_RET1(handle, status); 9894837a640SSieu Mun Tang 9904837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_PROVISION_DATA: 9914837a640SSieu Mun Tang status = intel_fcs_get_provision_data(&send_id); 9924837a640SSieu Mun Tang SMC_RET1(handle, status); 9934837a640SSieu Mun Tang 9947facacecSSieu Mun Tang case INTEL_SIP_SMC_FCS_CNTR_SET_PREAUTH: 9957facacecSSieu Mun Tang status = intel_fcs_cntr_set_preauth(x1, x2, x3, 9967facacecSSieu Mun Tang &mbox_error); 9977facacecSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 9987facacecSSieu Mun Tang 99911f4f030SSieu Mun Tang case INTEL_SIP_SMC_HPS_SET_BRIDGES: 100011f4f030SSieu Mun Tang status = intel_hps_set_bridges(x1, x2); 100111f4f030SSieu Mun Tang SMC_RET1(handle, status); 100211f4f030SSieu Mun Tang 1003ad47f142SSieu Mun Tang case INTEL_SIP_SMC_HWMON_READTEMP: 1004ad47f142SSieu Mun Tang status = intel_hwmon_readtemp(x1, &retval); 1005ad47f142SSieu Mun Tang SMC_RET2(handle, status, retval); 1006ad47f142SSieu Mun Tang 1007ad47f142SSieu Mun Tang case INTEL_SIP_SMC_HWMON_READVOLT: 1008ad47f142SSieu Mun Tang status = intel_hwmon_readvolt(x1, &retval); 1009ad47f142SSieu Mun Tang SMC_RET2(handle, status, retval); 1010ad47f142SSieu Mun Tang 1011d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_PSGSIGMA_TEARDOWN: 1012d1740831SSieu Mun Tang status = intel_fcs_sigma_teardown(x1, &mbox_error); 1013d1740831SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1014d1740831SSieu Mun Tang 1015d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_CHIP_ID: 1016d1740831SSieu Mun Tang status = intel_fcs_chip_id(&retval, &retval2, &mbox_error); 1017d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, retval, retval2); 1018d1740831SSieu Mun Tang 1019d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_ATTESTATION_SUBKEY: 1020d1740831SSieu Mun Tang status = intel_fcs_attestation_subkey(x1, x2, x3, 1021d1740831SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1022d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1023d1740831SSieu Mun Tang 1024d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_ATTESTATION_MEASUREMENTS: 1025d1740831SSieu Mun Tang status = intel_fcs_get_measurement(x1, x2, x3, 1026d1740831SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1027d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1028d1740831SSieu Mun Tang 1029581182c1SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_ATTESTATION_CERT: 1030581182c1SSieu Mun Tang status = intel_fcs_get_attestation_cert(x1, x2, 1031581182c1SSieu Mun Tang (uint32_t *) &x3, &mbox_error); 1032581182c1SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x2, x3); 1033581182c1SSieu Mun Tang 1034581182c1SSieu Mun Tang case INTEL_SIP_SMC_FCS_CREATE_CERT_ON_RELOAD: 1035581182c1SSieu Mun Tang status = intel_fcs_create_cert_on_reload(x1, &mbox_error); 1036581182c1SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1037581182c1SSieu Mun Tang 10386dc00c24SSieu Mun Tang case INTEL_SIP_SMC_FCS_OPEN_CS_SESSION: 10396dc00c24SSieu Mun Tang status = intel_fcs_open_crypto_service_session(&retval, &mbox_error); 10406dc00c24SSieu Mun Tang SMC_RET3(handle, status, mbox_error, retval); 10416dc00c24SSieu Mun Tang 10426dc00c24SSieu Mun Tang case INTEL_SIP_SMC_FCS_CLOSE_CS_SESSION: 10436dc00c24SSieu Mun Tang status = intel_fcs_close_crypto_service_session(x1, &mbox_error); 10446dc00c24SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10456dc00c24SSieu Mun Tang 1046342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_IMPORT_CS_KEY: 1047342a0618SSieu Mun Tang status = intel_fcs_import_crypto_service_key(x1, x2, &send_id); 1048342a0618SSieu Mun Tang SMC_RET1(handle, status); 1049342a0618SSieu Mun Tang 1050342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_EXPORT_CS_KEY: 1051342a0618SSieu Mun Tang status = intel_fcs_export_crypto_service_key(x1, x2, x3, 1052342a0618SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1053342a0618SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1054342a0618SSieu Mun Tang 1055342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_REMOVE_CS_KEY: 1056342a0618SSieu Mun Tang status = intel_fcs_remove_crypto_service_key(x1, x2, 1057342a0618SSieu Mun Tang &mbox_error); 1058342a0618SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1059342a0618SSieu Mun Tang 1060342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_CS_KEY_INFO: 1061342a0618SSieu Mun Tang status = intel_fcs_get_crypto_service_key_info(x1, x2, x3, 1062342a0618SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1063342a0618SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1064342a0618SSieu Mun Tang 10657e8249a2SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_INIT: 10667e8249a2SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10677e8249a2SSieu Mun Tang status = intel_fcs_get_digest_init(x1, x2, x3, 10687e8249a2SSieu Mun Tang x4, x5, &mbox_error); 10697e8249a2SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10707e8249a2SSieu Mun Tang 107170a7e6afSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_UPDATE: 107270a7e6afSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 107370a7e6afSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 107470a7e6afSSieu Mun Tang status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 107570a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, false, 107670a7e6afSSieu Mun Tang &mbox_error); 107770a7e6afSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 107870a7e6afSSieu Mun Tang 10797e8249a2SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_FINALIZE: 10807e8249a2SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10817e8249a2SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 108270a7e6afSSieu Mun Tang status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 108370a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, true, 108470a7e6afSSieu Mun Tang &mbox_error); 10857e8249a2SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 10867e8249a2SSieu Mun Tang 10874687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_UPDATE: 10884687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10894687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 10904687021dSSieu Mun Tang status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 10914687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, false, 10924687021dSSieu Mun Tang &mbox_error, &send_id); 10934687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 10944687021dSSieu Mun Tang 10954687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_FINALIZE: 10964687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10974687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 10984687021dSSieu Mun Tang status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 10994687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, true, 11004687021dSSieu Mun Tang &mbox_error, &send_id); 11014687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11024687021dSSieu Mun Tang 1103c05ea296SSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_INIT: 1104c05ea296SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1105c05ea296SSieu Mun Tang status = intel_fcs_mac_verify_init(x1, x2, x3, 1106c05ea296SSieu Mun Tang x4, x5, &mbox_error); 1107c05ea296SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1108c05ea296SSieu Mun Tang 110970a7e6afSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_UPDATE: 111070a7e6afSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 111170a7e6afSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 111270a7e6afSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 111370a7e6afSSieu Mun Tang status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 111470a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 111570a7e6afSSieu Mun Tang false, &mbox_error); 111670a7e6afSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 111770a7e6afSSieu Mun Tang 1118c05ea296SSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_FINALIZE: 1119c05ea296SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1120c05ea296SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1121c05ea296SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 112270a7e6afSSieu Mun Tang status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 112370a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 112470a7e6afSSieu Mun Tang true, &mbox_error); 1125c05ea296SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 1126c05ea296SSieu Mun Tang 11274687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_UPDATE: 11284687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11294687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11304687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 11314687021dSSieu Mun Tang status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 11324687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 11334687021dSSieu Mun Tang false, &mbox_error, &send_id); 11344687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11354687021dSSieu Mun Tang 11364687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_FINALIZE: 11374687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11384687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11394687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 11404687021dSSieu Mun Tang status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 11414687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 11424687021dSSieu Mun Tang true, &mbox_error, &send_id); 11434687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11444687021dSSieu Mun Tang 114507912da1SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_INIT: 114607912da1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 114707912da1SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_init(x1, x2, x3, 114807912da1SSieu Mun Tang x4, x5, &mbox_error); 114907912da1SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 115007912da1SSieu Mun Tang 11511d97dd74SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_UPDATE: 11521d97dd74SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11531d97dd74SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11541d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 11551d97dd74SSieu Mun Tang x3, x4, x5, (uint32_t *) &x6, false, 11561d97dd74SSieu Mun Tang &mbox_error); 11571d97dd74SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11581d97dd74SSieu Mun Tang 115907912da1SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_FINALIZE: 116007912da1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 116107912da1SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11621d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 11631d97dd74SSieu Mun Tang x3, x4, x5, (uint32_t *) &x6, true, 11641d97dd74SSieu Mun Tang &mbox_error); 116507912da1SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 116607912da1SSieu Mun Tang 11674687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_UPDATE: 11684687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11694687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11704687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 11714687021dSSieu Mun Tang x2, x3, x4, x5, (uint32_t *) &x6, false, 11724687021dSSieu Mun Tang &mbox_error, &send_id); 11734687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11744687021dSSieu Mun Tang 11754687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_FINALIZE: 11764687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11774687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11784687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 11794687021dSSieu Mun Tang x2, x3, x4, x5, (uint32_t *) &x6, true, 11804687021dSSieu Mun Tang &mbox_error, &send_id); 11814687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11824687021dSSieu Mun Tang 118369254105SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_INIT: 118469254105SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 118569254105SSieu Mun Tang status = intel_fcs_ecdsa_hash_sign_init(x1, x2, x3, 118669254105SSieu Mun Tang x4, x5, &mbox_error); 118769254105SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 118869254105SSieu Mun Tang 118969254105SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_FINALIZE: 119069254105SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 119169254105SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 119269254105SSieu Mun Tang status = intel_fcs_ecdsa_hash_sign_finalize(x1, x2, x3, 119369254105SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 119469254105SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 119569254105SSieu Mun Tang 11967e25eb87SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_INIT: 11977e25eb87SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11987e25eb87SSieu Mun Tang status = intel_fcs_ecdsa_hash_sig_verify_init(x1, x2, x3, 11997e25eb87SSieu Mun Tang x4, x5, &mbox_error); 12007e25eb87SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 12017e25eb87SSieu Mun Tang 12027e25eb87SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_FINALIZE: 12037e25eb87SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12047e25eb87SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12057e25eb87SSieu Mun Tang status = intel_fcs_ecdsa_hash_sig_verify_finalize(x1, x2, x3, 12067e25eb87SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 12077e25eb87SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12087e25eb87SSieu Mun Tang 120958305060SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_INIT: 121058305060SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 121158305060SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_init(x1, x2, x3, 121258305060SSieu Mun Tang x4, x5, &mbox_error); 121358305060SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 121458305060SSieu Mun Tang 12151d97dd74SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_UPDATE: 12161d97dd74SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12171d97dd74SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12181d97dd74SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12191d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 12201d97dd74SSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12211d97dd74SSieu Mun Tang x7, false, &mbox_error); 12221d97dd74SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12231d97dd74SSieu Mun Tang 12244687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_UPDATE: 12254687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12264687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12274687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12284687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 12294687021dSSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12304687021dSSieu Mun Tang x7, false, &mbox_error, &send_id); 12314687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12324687021dSSieu Mun Tang 12334687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_FINALIZE: 12344687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12354687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12364687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12374687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 12384687021dSSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12394687021dSSieu Mun Tang x7, true, &mbox_error, &send_id); 12404687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12414687021dSSieu Mun Tang 124258305060SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_FINALIZE: 124358305060SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 124458305060SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 124558305060SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12461d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 12471d97dd74SSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12481d97dd74SSieu Mun Tang x7, true, &mbox_error); 124958305060SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 125007912da1SSieu Mun Tang 1251d2fee94aSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_INIT: 1252d2fee94aSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1253d2fee94aSSieu Mun Tang status = intel_fcs_ecdsa_get_pubkey_init(x1, x2, x3, 1254d2fee94aSSieu Mun Tang x4, x5, &mbox_error); 1255d2fee94aSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1256d2fee94aSSieu Mun Tang 1257d2fee94aSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_FINALIZE: 1258d2fee94aSSieu Mun Tang status = intel_fcs_ecdsa_get_pubkey_finalize(x1, x2, x3, 1259d2fee94aSSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1260d2fee94aSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1261d2fee94aSSieu Mun Tang 126249446866SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDH_REQUEST_INIT: 126349446866SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 126449446866SSieu Mun Tang status = intel_fcs_ecdh_request_init(x1, x2, x3, 126549446866SSieu Mun Tang x4, x5, &mbox_error); 126649446866SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 126749446866SSieu Mun Tang 126849446866SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDH_REQUEST_FINALIZE: 126949446866SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 127049446866SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 127149446866SSieu Mun Tang status = intel_fcs_ecdh_request_finalize(x1, x2, x3, 127249446866SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 127349446866SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 127449446866SSieu Mun Tang 12756726390eSSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_INIT: 12766726390eSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12776726390eSSieu Mun Tang status = intel_fcs_aes_crypt_init(x1, x2, x3, x4, x5, 12786726390eSSieu Mun Tang &mbox_error); 12796726390eSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 12806726390eSSieu Mun Tang 1281dcb144f1SSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_UPDATE: 1282dcb144f1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1283dcb144f1SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1284dcb144f1SSieu Mun Tang status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1285dcb144f1SSieu Mun Tang x5, x6, false, &send_id); 1286dcb144f1SSieu Mun Tang SMC_RET1(handle, status); 1287dcb144f1SSieu Mun Tang 12886726390eSSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_FINALIZE: 12896726390eSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12906726390eSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1291dcb144f1SSieu Mun Tang status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1292dcb144f1SSieu Mun Tang x5, x6, true, &send_id); 12936726390eSSieu Mun Tang SMC_RET1(handle, status); 12946726390eSSieu Mun Tang 129577902fcaSSieu Mun Tang case INTEL_SIP_SMC_GET_ROM_PATCH_SHA384: 129677902fcaSSieu Mun Tang status = intel_fcs_get_rom_patch_sha384(x1, &retval64, 129777902fcaSSieu Mun Tang &mbox_error); 129877902fcaSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, retval64); 129977902fcaSSieu Mun Tang 1300f0c40b89SSieu Mun Tang case INTEL_SIP_SMC_SVC_VERSION: 1301f0c40b89SSieu Mun Tang SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 1302f0c40b89SSieu Mun Tang SIP_SVC_VERSION_MAJOR, 1303f0c40b89SSieu Mun Tang SIP_SVC_VERSION_MINOR); 1304f0c40b89SSieu Mun Tang 130591239f2cSJit Loon Lim case INTEL_SIP_SMC_SEU_ERR_STATUS: 130691239f2cSJit Loon Lim status = intel_sdm_seu_err_read(seu_respbuf, 130791239f2cSJit Loon Lim ARRAY_SIZE(seu_respbuf)); 130891239f2cSJit Loon Lim if (status) { 130991239f2cSJit Loon Lim SMC_RET1(handle, status); 131091239f2cSJit Loon Lim } else { 131191239f2cSJit Loon Lim SMC_RET3(handle, seu_respbuf[0], seu_respbuf[1], seu_respbuf[2]); 131291239f2cSJit Loon Lim } 131391239f2cSJit Loon Lim 1314fffcb25cSJit Loon Lim case INTEL_SIP_SMC_SAFE_INJECT_SEU_ERR: 1315fffcb25cSJit Loon Lim status = intel_sdm_safe_inject_seu_err((uint32_t *)&x1, (uint32_t)x2); 1316fffcb25cSJit Loon Lim SMC_RET1(handle, status); 1317fffcb25cSJit Loon Lim 1318c76d4239SHadi Asyrafi default: 1319c76d4239SHadi Asyrafi return socfpga_sip_handler(smc_fid, x1, x2, x3, x4, 1320c76d4239SHadi Asyrafi cookie, handle, flags); 1321c76d4239SHadi Asyrafi } 1322c76d4239SHadi Asyrafi } 1323c76d4239SHadi Asyrafi 1324ad47f142SSieu Mun Tang uintptr_t sip_smc_handler(uint32_t smc_fid, 1325ad47f142SSieu Mun Tang u_register_t x1, 1326ad47f142SSieu Mun Tang u_register_t x2, 1327ad47f142SSieu Mun Tang u_register_t x3, 1328ad47f142SSieu Mun Tang u_register_t x4, 1329ad47f142SSieu Mun Tang void *cookie, 1330ad47f142SSieu Mun Tang void *handle, 1331ad47f142SSieu Mun Tang u_register_t flags) 1332ad47f142SSieu Mun Tang { 1333ad47f142SSieu Mun Tang uint32_t cmd = smc_fid & INTEL_SIP_SMC_CMD_MASK; 1334ad47f142SSieu Mun Tang 1335ad47f142SSieu Mun Tang if (cmd >= INTEL_SIP_SMC_CMD_V2_RANGE_BEGIN && 1336ad47f142SSieu Mun Tang cmd <= INTEL_SIP_SMC_CMD_V2_RANGE_END) { 1337ad47f142SSieu Mun Tang return sip_smc_handler_v2(smc_fid, x1, x2, x3, x4, 1338ad47f142SSieu Mun Tang cookie, handle, flags); 1339ad47f142SSieu Mun Tang } else { 1340ad47f142SSieu Mun Tang return sip_smc_handler_v1(smc_fid, x1, x2, x3, x4, 1341ad47f142SSieu Mun Tang cookie, handle, flags); 1342ad47f142SSieu Mun Tang } 1343ad47f142SSieu Mun Tang } 1344ad47f142SSieu Mun Tang 1345c76d4239SHadi Asyrafi DECLARE_RT_SVC( 1346c76d4239SHadi Asyrafi socfpga_sip_svc, 1347c76d4239SHadi Asyrafi OEN_SIP_START, 1348c76d4239SHadi Asyrafi OEN_SIP_END, 1349c76d4239SHadi Asyrafi SMC_TYPE_FAST, 1350c76d4239SHadi Asyrafi NULL, 1351c76d4239SHadi Asyrafi sip_smc_handler 1352c76d4239SHadi Asyrafi ); 1353c76d4239SHadi Asyrafi 1354c76d4239SHadi Asyrafi DECLARE_RT_SVC( 1355c76d4239SHadi Asyrafi socfpga_sip_svc_std, 1356c76d4239SHadi Asyrafi OEN_SIP_START, 1357c76d4239SHadi Asyrafi OEN_SIP_END, 1358c76d4239SHadi Asyrafi SMC_TYPE_YIELD, 1359c76d4239SHadi Asyrafi NULL, 1360c76d4239SHadi Asyrafi sip_smc_handler 1361c76d4239SHadi Asyrafi ); 1362