1c76d4239SHadi Asyrafi /* 26197dc98SJit Loon Lim * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved. 3*8fb1b484SKah Jing Lee * Copyright (c) 2019-2023, Intel Corporation. All rights reserved. 4*8fb1b484SKah 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 4228e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_0)): /* EMAC0 */ 4238e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_1)): /* EMAC1 */ 4248e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_2)): /* EMAC2 */ 4258e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_VALUE)): /* ECC_INT_MASK_VALUE */ 4268e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_SET)): /* ECC_INT_MASK_SET */ 4278e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_CLR)): /* ECC_INT_MASK_CLEAR */ 4288e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_SERR)): /* ECC_INTSTATUS_SERR */ 4298e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_DERR)): /* ECC_INTSTATUS_DERR */ 4308e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(NOC_TIMEOUT)): /* NOC_TIMEOUT */ 4318e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(NOC_IDLESTATUS)): /* NOC_IDLESTATUS */ 4328e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_0)): /* BOOT_SCRATCH_COLD0 */ 4338e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_1)): /* BOOT_SCRATCH_COLD1 */ 4348e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_8)): /* BOOT_SCRATCH_COLD8 */ 4358e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_9)): /* BOOT_SCRATCH_COLD9 */ 4368e59b9f4SJit Loon Lim #endif 4374d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(CTRL)): /* ECC_QSPI_CTRL */ 4384d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTEN)): /* ECC_QSPI_ERRINTEN */ 4394d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTENS)): /* ECC_QSPI_ERRINTENS */ 4404d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTENR)): /* ECC_QSPI_ERRINTENR */ 4414d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTMODE)): /* ECC_QSPI_INTMODE */ 4424d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_ACCCTRL)): /* ECC_QSPI_ECC_ACCCTRL */ 4434d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_STARTACC)): /* ECC_QSPI_ECC_STARTACC */ 4444d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_WDCTRL)): /* ECC_QSPI_ECC_WDCTRL */ 4454d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTSTAT)): /* ECC_QSPI_INTSTAT */ 4464d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTTEST)): /* ECC_QSPI_INTMODE */ 44713d33d52SHadi Asyrafi return 0; 448d6ae69c8SSieu Mun Tang 44913d33d52SHadi Asyrafi default: 45013d33d52SHadi Asyrafi break; 45113d33d52SHadi Asyrafi } 45213d33d52SHadi Asyrafi 45313d33d52SHadi Asyrafi return -1; 45413d33d52SHadi Asyrafi } 45513d33d52SHadi Asyrafi 45613d33d52SHadi Asyrafi /* Secure register access */ 45713d33d52SHadi Asyrafi uint32_t intel_secure_reg_read(uint64_t reg_addr, uint32_t *retval) 45813d33d52SHadi Asyrafi { 45913d33d52SHadi Asyrafi if (is_out_of_sec_range(reg_addr)) { 46013d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 46113d33d52SHadi Asyrafi } 46213d33d52SHadi Asyrafi 46313d33d52SHadi Asyrafi *retval = mmio_read_32(reg_addr); 46413d33d52SHadi Asyrafi 46513d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 46613d33d52SHadi Asyrafi } 46713d33d52SHadi Asyrafi 46813d33d52SHadi Asyrafi uint32_t intel_secure_reg_write(uint64_t reg_addr, uint32_t val, 46913d33d52SHadi Asyrafi uint32_t *retval) 47013d33d52SHadi Asyrafi { 47113d33d52SHadi Asyrafi if (is_out_of_sec_range(reg_addr)) { 47213d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 47313d33d52SHadi Asyrafi } 47413d33d52SHadi Asyrafi 4754d122e5fSJit Loon Lim switch (reg_addr) { 4764d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTSTAT)): /* ECC_QSPI_INTSTAT */ 4774d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTTEST)): /* ECC_QSPI_INTMODE */ 4784d122e5fSJit Loon Lim mmio_write_16(reg_addr, val); 4794d122e5fSJit Loon Lim break; 4804d122e5fSJit Loon Lim default: 48113d33d52SHadi Asyrafi mmio_write_32(reg_addr, val); 4824d122e5fSJit Loon Lim break; 4834d122e5fSJit Loon Lim } 48413d33d52SHadi Asyrafi 48513d33d52SHadi Asyrafi return intel_secure_reg_read(reg_addr, retval); 48613d33d52SHadi Asyrafi } 48713d33d52SHadi Asyrafi 48813d33d52SHadi Asyrafi uint32_t intel_secure_reg_update(uint64_t reg_addr, uint32_t mask, 48913d33d52SHadi Asyrafi uint32_t val, uint32_t *retval) 49013d33d52SHadi Asyrafi { 49113d33d52SHadi Asyrafi if (!intel_secure_reg_read(reg_addr, retval)) { 49213d33d52SHadi Asyrafi *retval &= ~mask; 493c9c07099SSiew Chin Lim *retval |= val & mask; 49413d33d52SHadi Asyrafi return intel_secure_reg_write(reg_addr, *retval, retval); 49513d33d52SHadi Asyrafi } 49613d33d52SHadi Asyrafi 49713d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 49813d33d52SHadi Asyrafi } 49913d33d52SHadi Asyrafi 500e1f97d9cSHadi Asyrafi /* Intel Remote System Update (RSU) services */ 501e1f97d9cSHadi Asyrafi uint64_t intel_rsu_update_address; 502e1f97d9cSHadi Asyrafi 503d57318b7SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_rsu_status(uint64_t *respbuf, unsigned int respbuf_sz) 504e1f97d9cSHadi Asyrafi { 505581182c1SSieu Mun Tang if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 506960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 507581182c1SSieu Mun Tang } 508e1f97d9cSHadi Asyrafi 509e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 510e1f97d9cSHadi Asyrafi } 511e1f97d9cSHadi Asyrafi 512*8fb1b484SKah Jing Lee static uint32_t intel_rsu_get_device_info(uint32_t *respbuf, 513*8fb1b484SKah Jing Lee unsigned int respbuf_sz) 514*8fb1b484SKah Jing Lee { 515*8fb1b484SKah Jing Lee if (mailbox_rsu_get_device_info((uint32_t *)respbuf, respbuf_sz) < 0) { 516*8fb1b484SKah Jing Lee return INTEL_SIP_SMC_RSU_ERROR; 517*8fb1b484SKah Jing Lee } 518*8fb1b484SKah Jing Lee 519*8fb1b484SKah Jing Lee return INTEL_SIP_SMC_STATUS_OK; 520*8fb1b484SKah Jing Lee } 521*8fb1b484SKah Jing Lee 522e3c3a48cSMahesh Rao uint32_t intel_rsu_update(uint64_t update_address) 523e1f97d9cSHadi Asyrafi { 524c418064eSJit Loon Lim if (update_address > SIZE_MAX) { 525c418064eSJit Loon Lim return INTEL_SIP_SMC_STATUS_REJECTED; 526c418064eSJit Loon Lim } 527c418064eSJit Loon Lim 528e1f97d9cSHadi Asyrafi intel_rsu_update_address = update_address; 529e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 530e1f97d9cSHadi Asyrafi } 531e1f97d9cSHadi Asyrafi 532ea9b9627SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_rsu_notify(uint32_t execution_stage) 533e1f97d9cSHadi Asyrafi { 534581182c1SSieu Mun Tang if (mailbox_hps_stage_notify(execution_stage) < 0) { 535960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 536581182c1SSieu Mun Tang } 537e1f97d9cSHadi Asyrafi 538e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 539e1f97d9cSHadi Asyrafi } 540e1f97d9cSHadi Asyrafi 541e1f97d9cSHadi Asyrafi static uint32_t intel_rsu_retry_counter(uint32_t *respbuf, uint32_t respbuf_sz, 542e1f97d9cSHadi Asyrafi uint32_t *ret_stat) 543e1f97d9cSHadi Asyrafi { 544581182c1SSieu Mun Tang if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 545960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 546581182c1SSieu Mun Tang } 547e1f97d9cSHadi Asyrafi 548e1f97d9cSHadi Asyrafi *ret_stat = respbuf[8]; 549e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 550e1f97d9cSHadi Asyrafi } 551e1f97d9cSHadi Asyrafi 55244eb782eSChee Hong Ang static uint32_t intel_rsu_copy_dcmf_version(uint64_t dcmf_ver_1_0, 55344eb782eSChee Hong Ang uint64_t dcmf_ver_3_2) 55444eb782eSChee Hong Ang { 55544eb782eSChee Hong Ang rsu_dcmf_ver[0] = dcmf_ver_1_0; 55644eb782eSChee Hong Ang rsu_dcmf_ver[1] = dcmf_ver_1_0 >> 32; 55744eb782eSChee Hong Ang rsu_dcmf_ver[2] = dcmf_ver_3_2; 55844eb782eSChee Hong Ang rsu_dcmf_ver[3] = dcmf_ver_3_2 >> 32; 55944eb782eSChee Hong Ang 56044eb782eSChee Hong Ang return INTEL_SIP_SMC_STATUS_OK; 56144eb782eSChee Hong Ang } 56244eb782eSChee Hong Ang 563984e236eSSieu Mun Tang static uint32_t intel_rsu_copy_dcmf_status(uint64_t dcmf_stat) 564984e236eSSieu Mun Tang { 565984e236eSSieu Mun Tang rsu_dcmf_stat[0] = 0xFFFF & (dcmf_stat >> (0 * 16)); 566984e236eSSieu Mun Tang rsu_dcmf_stat[1] = 0xFFFF & (dcmf_stat >> (1 * 16)); 567984e236eSSieu Mun Tang rsu_dcmf_stat[2] = 0xFFFF & (dcmf_stat >> (2 * 16)); 568984e236eSSieu Mun Tang rsu_dcmf_stat[3] = 0xFFFF & (dcmf_stat >> (3 * 16)); 569984e236eSSieu Mun Tang 570984e236eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 571984e236eSSieu Mun Tang } 572984e236eSSieu Mun Tang 57352cf9c2cSKris Chaplin /* Intel HWMON services */ 57452cf9c2cSKris Chaplin static uint32_t intel_hwmon_readtemp(uint32_t chan, uint32_t *retval) 57552cf9c2cSKris Chaplin { 57652cf9c2cSKris Chaplin if (mailbox_hwmon_readtemp(chan, retval) < 0) { 57752cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_ERROR; 57852cf9c2cSKris Chaplin } 57952cf9c2cSKris Chaplin 58052cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_OK; 58152cf9c2cSKris Chaplin } 58252cf9c2cSKris Chaplin 58352cf9c2cSKris Chaplin static uint32_t intel_hwmon_readvolt(uint32_t chan, uint32_t *retval) 58452cf9c2cSKris Chaplin { 58552cf9c2cSKris Chaplin if (mailbox_hwmon_readvolt(chan, retval) < 0) { 58652cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_ERROR; 58752cf9c2cSKris Chaplin } 58852cf9c2cSKris Chaplin 58952cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_OK; 59052cf9c2cSKris Chaplin } 59152cf9c2cSKris Chaplin 5920c5d62adSHadi Asyrafi /* Mailbox services */ 593c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_smc_fw_version(uint32_t *fw_version) 594c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi { 595c026dfe3SSieu Mun Tang int status; 596c026dfe3SSieu Mun Tang unsigned int resp_len = CONFIG_STATUS_WORD_SIZE; 597c026dfe3SSieu Mun Tang uint32_t resp_data[CONFIG_STATUS_WORD_SIZE] = {0U}; 598c026dfe3SSieu Mun Tang 599c026dfe3SSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CONFIG_STATUS, NULL, 0U, 600c026dfe3SSieu Mun Tang CMD_CASUAL, resp_data, &resp_len); 601c026dfe3SSieu Mun Tang 602c026dfe3SSieu Mun Tang if (status < 0) { 603c026dfe3SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 604c026dfe3SSieu Mun Tang } 605c026dfe3SSieu Mun Tang 606c026dfe3SSieu Mun Tang if (resp_len <= CONFIG_STATUS_FW_VER_OFFSET) { 607c026dfe3SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 608c026dfe3SSieu Mun Tang } 609c026dfe3SSieu Mun Tang 610c026dfe3SSieu Mun Tang *fw_version = resp_data[CONFIG_STATUS_FW_VER_OFFSET] & CONFIG_STATUS_FW_VER_MASK; 611c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 612c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 613c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi } 614c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 615a250c04bSSieu Mun Tang static uint32_t intel_mbox_send_cmd(uint32_t cmd, uint32_t *args, 616ac097fdfSSieu Mun Tang unsigned int len, uint32_t urgent, uint64_t response, 617a250c04bSSieu Mun Tang unsigned int resp_len, int *mbox_status, 618a250c04bSSieu Mun Tang unsigned int *len_in_resp) 6190c5d62adSHadi Asyrafi { 6201a87db5dSAbdul Halim, Muhammad Hadi Asyrafi *len_in_resp = 0; 621651841f2SSieu Mun Tang *mbox_status = GENERIC_RESPONSE_ERROR; 6221a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 623581182c1SSieu Mun Tang if (!is_address_in_ddr_range((uint64_t)args, sizeof(uint32_t) * len)) { 6241a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_REJECTED; 625581182c1SSieu Mun Tang } 6261a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 6270c5d62adSHadi Asyrafi int status = mailbox_send_cmd(MBOX_JOB_ID, cmd, args, len, urgent, 628ac097fdfSSieu Mun Tang (uint32_t *) response, &resp_len); 6290c5d62adSHadi Asyrafi 6300c5d62adSHadi Asyrafi if (status < 0) { 6310c5d62adSHadi Asyrafi *mbox_status = -status; 6320c5d62adSHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 6330c5d62adSHadi Asyrafi } 6340c5d62adSHadi Asyrafi 6350c5d62adSHadi Asyrafi *mbox_status = 0; 636a250c04bSSieu Mun Tang *len_in_resp = resp_len; 637ac097fdfSSieu Mun Tang 638ac097fdfSSieu Mun Tang flush_dcache_range(response, resp_len * MBOX_WORD_BYTE); 639ac097fdfSSieu Mun Tang 6400c5d62adSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 6410c5d62adSHadi Asyrafi } 6420c5d62adSHadi Asyrafi 64393a5b97eSSieu Mun Tang static int intel_smc_get_usercode(uint32_t *user_code) 64493a5b97eSSieu Mun Tang { 64593a5b97eSSieu Mun Tang int status; 64693a5b97eSSieu Mun Tang unsigned int resp_len = sizeof(user_code) / MBOX_WORD_BYTE; 64793a5b97eSSieu Mun Tang 64893a5b97eSSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_GET_USERCODE, NULL, 64993a5b97eSSieu Mun Tang 0U, CMD_CASUAL, user_code, &resp_len); 65093a5b97eSSieu Mun Tang 65193a5b97eSSieu Mun Tang if (status < 0) { 65293a5b97eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 65393a5b97eSSieu Mun Tang } 65493a5b97eSSieu Mun Tang 65593a5b97eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 65693a5b97eSSieu Mun Tang } 65793a5b97eSSieu Mun Tang 6584837a640SSieu Mun Tang uint32_t intel_smc_service_completed(uint64_t addr, uint32_t size, 6594837a640SSieu Mun Tang uint32_t mode, uint32_t *job_id, 6604837a640SSieu Mun Tang uint32_t *ret_size, uint32_t *mbox_error) 6614837a640SSieu Mun Tang { 6624837a640SSieu Mun Tang int status = 0; 6634837a640SSieu Mun Tang uint32_t resp_len = size / MBOX_WORD_BYTE; 6644837a640SSieu Mun Tang 6654837a640SSieu Mun Tang if (resp_len > MBOX_DATA_MAX_LEN) { 6664837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_REJECTED; 6674837a640SSieu Mun Tang } 6684837a640SSieu Mun Tang 6694837a640SSieu Mun Tang if (!is_address_in_ddr_range(addr, size)) { 6704837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_REJECTED; 6714837a640SSieu Mun Tang } 6724837a640SSieu Mun Tang 6734837a640SSieu Mun Tang if (mode == SERVICE_COMPLETED_MODE_ASYNC) { 6744837a640SSieu Mun Tang status = mailbox_read_response_async(job_id, 6754837a640SSieu Mun Tang NULL, (uint32_t *) addr, &resp_len, 0); 6764837a640SSieu Mun Tang } else { 6774837a640SSieu Mun Tang status = mailbox_read_response(job_id, 6784837a640SSieu Mun Tang (uint32_t *) addr, &resp_len); 6794837a640SSieu Mun Tang 6804837a640SSieu Mun Tang if (status == MBOX_NO_RESPONSE) { 6814837a640SSieu Mun Tang status = MBOX_BUSY; 6824837a640SSieu Mun Tang } 6834837a640SSieu Mun Tang } 6844837a640SSieu Mun Tang 6854837a640SSieu Mun Tang if (status == MBOX_NO_RESPONSE) { 6864837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_NO_RESPONSE; 6874837a640SSieu Mun Tang } 6884837a640SSieu Mun Tang 6894837a640SSieu Mun Tang if (status == MBOX_BUSY) { 6904837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_BUSY; 6914837a640SSieu Mun Tang } 6924837a640SSieu Mun Tang 6934837a640SSieu Mun Tang *ret_size = resp_len * MBOX_WORD_BYTE; 6944837a640SSieu Mun Tang flush_dcache_range(addr, *ret_size); 6954837a640SSieu Mun Tang 69676ed3223SSieu Mun Tang if (status == MBOX_RET_SDOS_DECRYPTION_ERROR_102 || 69776ed3223SSieu Mun Tang status == MBOX_RET_SDOS_DECRYPTION_ERROR_103) { 69876ed3223SSieu Mun Tang *mbox_error = -status; 69976ed3223SSieu Mun Tang } else if (status != MBOX_RET_OK) { 7004837a640SSieu Mun Tang *mbox_error = -status; 7014837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 7024837a640SSieu Mun Tang } 7034837a640SSieu Mun Tang 7044837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 7054837a640SSieu Mun Tang } 7064837a640SSieu Mun Tang 707b703facaSSieu Mun Tang /* Miscellaneous HPS services */ 708b703facaSSieu Mun Tang uint32_t intel_hps_set_bridges(uint64_t enable, uint64_t mask) 709b703facaSSieu Mun Tang { 710b703facaSSieu Mun Tang int status = 0; 711b703facaSSieu Mun Tang 712ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_ENABLE) != 0U) { 713ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 714b703facaSSieu Mun Tang status = socfpga_bridges_enable((uint32_t)mask); 715b703facaSSieu Mun Tang } else { 716b703facaSSieu Mun Tang status = socfpga_bridges_enable(~0); 717b703facaSSieu Mun Tang } 718b703facaSSieu Mun Tang } else { 719ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 720b703facaSSieu Mun Tang status = socfpga_bridges_disable((uint32_t)mask); 721b703facaSSieu Mun Tang } else { 722b703facaSSieu Mun Tang status = socfpga_bridges_disable(~0); 723b703facaSSieu Mun Tang } 724b703facaSSieu Mun Tang } 725b703facaSSieu Mun Tang 726b703facaSSieu Mun Tang if (status < 0) { 727b703facaSSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 728b703facaSSieu Mun Tang } 729b703facaSSieu Mun Tang 730b703facaSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 731b703facaSSieu Mun Tang } 732b703facaSSieu Mun Tang 73391239f2cSJit Loon Lim /* SDM SEU Error services */ 734fffcb25cSJit Loon Lim static uint32_t intel_sdm_seu_err_read(uint32_t *respbuf, unsigned int respbuf_sz) 73591239f2cSJit Loon Lim { 736fffcb25cSJit Loon Lim if (mailbox_seu_err_status(respbuf, respbuf_sz) < 0) { 737fffcb25cSJit Loon Lim return INTEL_SIP_SMC_SEU_ERR_READ_ERROR; 738fffcb25cSJit Loon Lim } 739fffcb25cSJit Loon Lim 740fffcb25cSJit Loon Lim return INTEL_SIP_SMC_STATUS_OK; 741fffcb25cSJit Loon Lim } 742fffcb25cSJit Loon Lim 743fffcb25cSJit Loon Lim /* SDM SAFE SEU Error inject services */ 744fffcb25cSJit Loon Lim static uint32_t intel_sdm_safe_inject_seu_err(uint32_t *command, uint32_t len) 745fffcb25cSJit Loon Lim { 746fffcb25cSJit Loon Lim if (mailbox_safe_inject_seu_err(command, len) < 0) { 74791239f2cSJit Loon Lim return INTEL_SIP_SMC_SEU_ERR_READ_ERROR; 74891239f2cSJit Loon Lim } 74991239f2cSJit Loon Lim 75091239f2cSJit Loon Lim return INTEL_SIP_SMC_STATUS_OK; 75191239f2cSJit Loon Lim } 75291239f2cSJit Loon Lim 753b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 754b727664eSSieu Mun Tang /* SMMU HPS Remapper */ 755b727664eSSieu Mun Tang void intel_smmu_hps_remapper_init(uint64_t *mem) 756b727664eSSieu Mun Tang { 757b727664eSSieu Mun Tang /* Read out Bit 1 value */ 758b727664eSSieu Mun Tang uint32_t remap = (mmio_read_32(SOCFPGA_SYSMGR(BOOT_SCRATCH_POR_1)) & 0x02); 759b727664eSSieu Mun Tang 760b727664eSSieu Mun Tang if (remap == 0x00) { 761b727664eSSieu Mun Tang /* Update DRAM Base address for SDM SMMU */ 762b727664eSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_ARADDR_REMAP), DRAM_BASE); 763b727664eSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_AWADDR_REMAP), DRAM_BASE); 764b727664eSSieu Mun Tang *mem = *mem - DRAM_BASE; 765b727664eSSieu Mun Tang } else { 766b727664eSSieu Mun Tang *mem = *mem - DRAM_BASE; 767b727664eSSieu Mun Tang } 768b727664eSSieu Mun Tang } 769b727664eSSieu Mun Tang #endif 770b727664eSSieu Mun Tang 771c76d4239SHadi Asyrafi /* 772c76d4239SHadi Asyrafi * This function is responsible for handling all SiP calls from the NS world 773c76d4239SHadi Asyrafi */ 774c76d4239SHadi Asyrafi 775ad47f142SSieu Mun Tang uintptr_t sip_smc_handler_v1(uint32_t smc_fid, 776c76d4239SHadi Asyrafi u_register_t x1, 777c76d4239SHadi Asyrafi u_register_t x2, 778c76d4239SHadi Asyrafi u_register_t x3, 779c76d4239SHadi Asyrafi u_register_t x4, 780c76d4239SHadi Asyrafi void *cookie, 781c76d4239SHadi Asyrafi void *handle, 782c76d4239SHadi Asyrafi u_register_t flags) 783c76d4239SHadi Asyrafi { 784d1740831SSieu Mun Tang uint32_t retval = 0, completed_addr[3]; 785d1740831SSieu Mun Tang uint32_t retval2 = 0; 78677902fcaSSieu Mun Tang uint32_t mbox_error = 0; 787fffcb25cSJit Loon Lim uint64_t retval64, rsu_respbuf[9]; 788fffcb25cSJit Loon Lim uint32_t seu_respbuf[3]; 789286b96f4SSieu Mun Tang int status = INTEL_SIP_SMC_STATUS_OK; 790a250c04bSSieu Mun Tang int mbox_status; 791a250c04bSSieu Mun Tang unsigned int len_in_resp; 792c05ea296SSieu Mun Tang u_register_t x5, x6, x7; 793f8e6a09cSAbdul Halim, Muhammad Hadi Asyrafi 794c76d4239SHadi Asyrafi switch (smc_fid) { 795c76d4239SHadi Asyrafi case SIP_SVC_UID: 796c76d4239SHadi Asyrafi /* Return UID to the caller */ 797c76d4239SHadi Asyrafi SMC_UUID_RET(handle, intl_svc_uid); 79813d33d52SHadi Asyrafi 799c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_ISDONE: 800673afd6fSSieu Mun Tang status = intel_mailbox_fpga_config_isdone(); 801c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 80213d33d52SHadi Asyrafi 803c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM: 804c76d4239SHadi Asyrafi SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 805c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR, 806c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_SIZE - 807c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR); 80813d33d52SHadi Asyrafi 809c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_START: 810c76d4239SHadi Asyrafi status = intel_fpga_config_start(x1); 811c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 81213d33d52SHadi Asyrafi 813c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_WRITE: 814c76d4239SHadi Asyrafi status = intel_fpga_config_write(x1, x2); 815c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 81613d33d52SHadi Asyrafi 817c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE: 818c76d4239SHadi Asyrafi status = intel_fpga_config_completed_write(completed_addr, 819aad868b4SAbdul Halim, Muhammad Hadi Asyrafi &retval, &rcv_id); 820aad868b4SAbdul Halim, Muhammad Hadi Asyrafi switch (retval) { 821c76d4239SHadi Asyrafi case 1: 822c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 823c76d4239SHadi Asyrafi completed_addr[0], 0, 0); 82413d33d52SHadi Asyrafi 825c76d4239SHadi Asyrafi case 2: 826c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 827c76d4239SHadi Asyrafi completed_addr[0], 828c76d4239SHadi Asyrafi completed_addr[1], 0); 82913d33d52SHadi Asyrafi 830c76d4239SHadi Asyrafi case 3: 831c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 832c76d4239SHadi Asyrafi completed_addr[0], 833c76d4239SHadi Asyrafi completed_addr[1], 834c76d4239SHadi Asyrafi completed_addr[2]); 83513d33d52SHadi Asyrafi 836c76d4239SHadi Asyrafi case 0: 837c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 83813d33d52SHadi Asyrafi 839c76d4239SHadi Asyrafi default: 840cefb37ebSTien Hock, Loh mailbox_clear_response(); 841c76d4239SHadi Asyrafi SMC_RET1(handle, INTEL_SIP_SMC_STATUS_ERROR); 842c76d4239SHadi Asyrafi } 84313d33d52SHadi Asyrafi 84413d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_READ: 845aad868b4SAbdul Halim, Muhammad Hadi Asyrafi status = intel_secure_reg_read(x1, &retval); 846aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 84713d33d52SHadi Asyrafi 84813d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_WRITE: 849aad868b4SAbdul Halim, Muhammad Hadi Asyrafi status = intel_secure_reg_write(x1, (uint32_t)x2, &retval); 850aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 85113d33d52SHadi Asyrafi 85213d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_UPDATE: 85313d33d52SHadi Asyrafi status = intel_secure_reg_update(x1, (uint32_t)x2, 854aad868b4SAbdul Halim, Muhammad Hadi Asyrafi (uint32_t)x3, &retval); 855aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 856c76d4239SHadi Asyrafi 857e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_STATUS: 858e1f97d9cSHadi Asyrafi status = intel_rsu_status(rsu_respbuf, 859e1f97d9cSHadi Asyrafi ARRAY_SIZE(rsu_respbuf)); 860e1f97d9cSHadi Asyrafi if (status) { 861e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 862e1f97d9cSHadi Asyrafi } else { 863e1f97d9cSHadi Asyrafi SMC_RET4(handle, rsu_respbuf[0], rsu_respbuf[1], 864e1f97d9cSHadi Asyrafi rsu_respbuf[2], rsu_respbuf[3]); 865e1f97d9cSHadi Asyrafi } 866e1f97d9cSHadi Asyrafi 867e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_UPDATE: 868e1f97d9cSHadi Asyrafi status = intel_rsu_update(x1); 869e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 870e1f97d9cSHadi Asyrafi 871e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_NOTIFY: 872e1f97d9cSHadi Asyrafi status = intel_rsu_notify(x1); 873e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 874e1f97d9cSHadi Asyrafi 875e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_RETRY_COUNTER: 876e1f97d9cSHadi Asyrafi status = intel_rsu_retry_counter((uint32_t *)rsu_respbuf, 877aad868b4SAbdul Halim, Muhammad Hadi Asyrafi ARRAY_SIZE(rsu_respbuf), &retval); 878e1f97d9cSHadi Asyrafi if (status) { 879e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 880e1f97d9cSHadi Asyrafi } else { 881aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET2(handle, status, retval); 882e1f97d9cSHadi Asyrafi } 883e1f97d9cSHadi Asyrafi 88444eb782eSChee Hong Ang case INTEL_SIP_SMC_RSU_DCMF_VERSION: 88544eb782eSChee Hong Ang SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 88644eb782eSChee Hong Ang ((uint64_t)rsu_dcmf_ver[1] << 32) | rsu_dcmf_ver[0], 88744eb782eSChee Hong Ang ((uint64_t)rsu_dcmf_ver[3] << 32) | rsu_dcmf_ver[2]); 88844eb782eSChee Hong Ang 88944eb782eSChee Hong Ang case INTEL_SIP_SMC_RSU_COPY_DCMF_VERSION: 89044eb782eSChee Hong Ang status = intel_rsu_copy_dcmf_version(x1, x2); 89144eb782eSChee Hong Ang SMC_RET1(handle, status); 89244eb782eSChee Hong Ang 893*8fb1b484SKah Jing Lee case INTEL_SIP_SMC_RSU_GET_DEVICE_INFO: 894*8fb1b484SKah Jing Lee status = intel_rsu_get_device_info((uint32_t *)rsu_respbuf, 895*8fb1b484SKah Jing Lee ARRAY_SIZE(rsu_respbuf)); 896*8fb1b484SKah Jing Lee if (status) { 897*8fb1b484SKah Jing Lee SMC_RET1(handle, status); 898*8fb1b484SKah Jing Lee } else { 899*8fb1b484SKah Jing Lee SMC_RET5(handle, status, rsu_respbuf[0], rsu_respbuf[1], 900*8fb1b484SKah Jing Lee rsu_respbuf[2], rsu_respbuf[3]); 901*8fb1b484SKah Jing Lee } 902*8fb1b484SKah Jing Lee 903984e236eSSieu Mun Tang case INTEL_SIP_SMC_RSU_DCMF_STATUS: 904984e236eSSieu Mun Tang SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, 905984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[3] << 48) | 906984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[2] << 32) | 907984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[1] << 16) | 908984e236eSSieu Mun Tang rsu_dcmf_stat[0]); 909984e236eSSieu Mun Tang 910984e236eSSieu Mun Tang case INTEL_SIP_SMC_RSU_COPY_DCMF_STATUS: 911984e236eSSieu Mun Tang status = intel_rsu_copy_dcmf_status(x1); 912984e236eSSieu Mun Tang SMC_RET1(handle, status); 913984e236eSSieu Mun Tang 9144c26957bSChee Hong Ang case INTEL_SIP_SMC_RSU_MAX_RETRY: 9154c26957bSChee Hong Ang SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, rsu_max_retry); 9164c26957bSChee Hong Ang 9174c26957bSChee Hong Ang case INTEL_SIP_SMC_RSU_COPY_MAX_RETRY: 9184c26957bSChee Hong Ang rsu_max_retry = x1; 9194c26957bSChee Hong Ang SMC_RET1(handle, INTEL_SIP_SMC_STATUS_OK); 9204c26957bSChee Hong Ang 921c703d752SSieu Mun Tang case INTEL_SIP_SMC_ECC_DBE: 922c703d752SSieu Mun Tang status = intel_ecc_dbe_notification(x1); 923c703d752SSieu Mun Tang SMC_RET1(handle, status); 924c703d752SSieu Mun Tang 925b703facaSSieu Mun Tang case INTEL_SIP_SMC_SERVICE_COMPLETED: 926b703facaSSieu Mun Tang status = intel_smc_service_completed(x1, x2, x3, &rcv_id, 927b703facaSSieu Mun Tang &len_in_resp, &mbox_error); 928b703facaSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, len_in_resp); 929b703facaSSieu Mun Tang 930c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi case INTEL_SIP_SMC_FIRMWARE_VERSION: 931c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi status = intel_smc_fw_version(&retval); 932c026dfe3SSieu Mun Tang SMC_RET2(handle, status, retval); 933c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 9340c5d62adSHadi Asyrafi case INTEL_SIP_SMC_MBOX_SEND_CMD: 9350c5d62adSHadi Asyrafi x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 9360c5d62adSHadi Asyrafi x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 937ac097fdfSSieu Mun Tang status = intel_mbox_send_cmd(x1, (uint32_t *)x2, x3, x4, x5, x6, 938ac097fdfSSieu Mun Tang &mbox_status, &len_in_resp); 939108514ffSSieu Mun Tang SMC_RET3(handle, status, mbox_status, len_in_resp); 9400c5d62adSHadi Asyrafi 94193a5b97eSSieu Mun Tang case INTEL_SIP_SMC_GET_USERCODE: 94293a5b97eSSieu Mun Tang status = intel_smc_get_usercode(&retval); 94393a5b97eSSieu Mun Tang SMC_RET2(handle, status, retval); 94493a5b97eSSieu Mun Tang 94502d3ef33SSieu Mun Tang case INTEL_SIP_SMC_FCS_CRYPTION: 94602d3ef33SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 94702d3ef33SSieu Mun Tang 94802d3ef33SSieu Mun Tang if (x1 == FCS_MODE_DECRYPT) { 94902d3ef33SSieu Mun Tang status = intel_fcs_decryption(x2, x3, x4, x5, &send_id); 95002d3ef33SSieu Mun Tang } else if (x1 == FCS_MODE_ENCRYPT) { 95102d3ef33SSieu Mun Tang status = intel_fcs_encryption(x2, x3, x4, x5, &send_id); 95202d3ef33SSieu Mun Tang } else { 95302d3ef33SSieu Mun Tang status = INTEL_SIP_SMC_STATUS_REJECTED; 95402d3ef33SSieu Mun Tang } 95502d3ef33SSieu Mun Tang 95602d3ef33SSieu Mun Tang SMC_RET3(handle, status, x4, x5); 95702d3ef33SSieu Mun Tang 958537ff052SSieu Mun Tang case INTEL_SIP_SMC_FCS_CRYPTION_EXT: 959537ff052SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 960537ff052SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 961537ff052SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 962537ff052SSieu Mun Tang 963537ff052SSieu Mun Tang if (x3 == FCS_MODE_DECRYPT) { 964537ff052SSieu Mun Tang status = intel_fcs_decryption_ext(x1, x2, x4, x5, x6, 965537ff052SSieu Mun Tang (uint32_t *) &x7, &mbox_error); 966537ff052SSieu Mun Tang } else if (x3 == FCS_MODE_ENCRYPT) { 967537ff052SSieu Mun Tang status = intel_fcs_encryption_ext(x1, x2, x4, x5, x6, 968537ff052SSieu Mun Tang (uint32_t *) &x7, &mbox_error); 969537ff052SSieu Mun Tang } else { 970537ff052SSieu Mun Tang status = INTEL_SIP_SMC_STATUS_REJECTED; 971537ff052SSieu Mun Tang } 972537ff052SSieu Mun Tang 973537ff052SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x6, x7); 974537ff052SSieu Mun Tang 9754837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_RANDOM_NUMBER: 9764837a640SSieu Mun Tang status = intel_fcs_random_number_gen(x1, &retval64, 9774837a640SSieu Mun Tang &mbox_error); 9784837a640SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, retval64); 9794837a640SSieu Mun Tang 98024f9dc8aSSieu Mun Tang case INTEL_SIP_SMC_FCS_RANDOM_NUMBER_EXT: 98124f9dc8aSSieu Mun Tang status = intel_fcs_random_number_gen_ext(x1, x2, x3, 98224f9dc8aSSieu Mun Tang &send_id); 98324f9dc8aSSieu Mun Tang SMC_RET1(handle, status); 98424f9dc8aSSieu Mun Tang 9854837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_SEND_CERTIFICATE: 9864837a640SSieu Mun Tang status = intel_fcs_send_cert(x1, x2, &send_id); 9874837a640SSieu Mun Tang SMC_RET1(handle, status); 9884837a640SSieu Mun Tang 9894837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_PROVISION_DATA: 9904837a640SSieu Mun Tang status = intel_fcs_get_provision_data(&send_id); 9914837a640SSieu Mun Tang SMC_RET1(handle, status); 9924837a640SSieu Mun Tang 9937facacecSSieu Mun Tang case INTEL_SIP_SMC_FCS_CNTR_SET_PREAUTH: 9947facacecSSieu Mun Tang status = intel_fcs_cntr_set_preauth(x1, x2, x3, 9957facacecSSieu Mun Tang &mbox_error); 9967facacecSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 9977facacecSSieu Mun Tang 99811f4f030SSieu Mun Tang case INTEL_SIP_SMC_HPS_SET_BRIDGES: 99911f4f030SSieu Mun Tang status = intel_hps_set_bridges(x1, x2); 100011f4f030SSieu Mun Tang SMC_RET1(handle, status); 100111f4f030SSieu Mun Tang 1002ad47f142SSieu Mun Tang case INTEL_SIP_SMC_HWMON_READTEMP: 1003ad47f142SSieu Mun Tang status = intel_hwmon_readtemp(x1, &retval); 1004ad47f142SSieu Mun Tang SMC_RET2(handle, status, retval); 1005ad47f142SSieu Mun Tang 1006ad47f142SSieu Mun Tang case INTEL_SIP_SMC_HWMON_READVOLT: 1007ad47f142SSieu Mun Tang status = intel_hwmon_readvolt(x1, &retval); 1008ad47f142SSieu Mun Tang SMC_RET2(handle, status, retval); 1009ad47f142SSieu Mun Tang 1010d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_PSGSIGMA_TEARDOWN: 1011d1740831SSieu Mun Tang status = intel_fcs_sigma_teardown(x1, &mbox_error); 1012d1740831SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1013d1740831SSieu Mun Tang 1014d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_CHIP_ID: 1015d1740831SSieu Mun Tang status = intel_fcs_chip_id(&retval, &retval2, &mbox_error); 1016d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, retval, retval2); 1017d1740831SSieu Mun Tang 1018d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_ATTESTATION_SUBKEY: 1019d1740831SSieu Mun Tang status = intel_fcs_attestation_subkey(x1, x2, x3, 1020d1740831SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1021d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1022d1740831SSieu Mun Tang 1023d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_ATTESTATION_MEASUREMENTS: 1024d1740831SSieu Mun Tang status = intel_fcs_get_measurement(x1, x2, x3, 1025d1740831SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1026d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1027d1740831SSieu Mun Tang 1028581182c1SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_ATTESTATION_CERT: 1029581182c1SSieu Mun Tang status = intel_fcs_get_attestation_cert(x1, x2, 1030581182c1SSieu Mun Tang (uint32_t *) &x3, &mbox_error); 1031581182c1SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x2, x3); 1032581182c1SSieu Mun Tang 1033581182c1SSieu Mun Tang case INTEL_SIP_SMC_FCS_CREATE_CERT_ON_RELOAD: 1034581182c1SSieu Mun Tang status = intel_fcs_create_cert_on_reload(x1, &mbox_error); 1035581182c1SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1036581182c1SSieu Mun Tang 10376dc00c24SSieu Mun Tang case INTEL_SIP_SMC_FCS_OPEN_CS_SESSION: 10386dc00c24SSieu Mun Tang status = intel_fcs_open_crypto_service_session(&retval, &mbox_error); 10396dc00c24SSieu Mun Tang SMC_RET3(handle, status, mbox_error, retval); 10406dc00c24SSieu Mun Tang 10416dc00c24SSieu Mun Tang case INTEL_SIP_SMC_FCS_CLOSE_CS_SESSION: 10426dc00c24SSieu Mun Tang status = intel_fcs_close_crypto_service_session(x1, &mbox_error); 10436dc00c24SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10446dc00c24SSieu Mun Tang 1045342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_IMPORT_CS_KEY: 1046342a0618SSieu Mun Tang status = intel_fcs_import_crypto_service_key(x1, x2, &send_id); 1047342a0618SSieu Mun Tang SMC_RET1(handle, status); 1048342a0618SSieu Mun Tang 1049342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_EXPORT_CS_KEY: 1050342a0618SSieu Mun Tang status = intel_fcs_export_crypto_service_key(x1, x2, x3, 1051342a0618SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1052342a0618SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1053342a0618SSieu Mun Tang 1054342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_REMOVE_CS_KEY: 1055342a0618SSieu Mun Tang status = intel_fcs_remove_crypto_service_key(x1, x2, 1056342a0618SSieu Mun Tang &mbox_error); 1057342a0618SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1058342a0618SSieu Mun Tang 1059342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_CS_KEY_INFO: 1060342a0618SSieu Mun Tang status = intel_fcs_get_crypto_service_key_info(x1, x2, x3, 1061342a0618SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1062342a0618SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1063342a0618SSieu Mun Tang 10647e8249a2SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_INIT: 10657e8249a2SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10667e8249a2SSieu Mun Tang status = intel_fcs_get_digest_init(x1, x2, x3, 10677e8249a2SSieu Mun Tang x4, x5, &mbox_error); 10687e8249a2SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10697e8249a2SSieu Mun Tang 107070a7e6afSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_UPDATE: 107170a7e6afSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 107270a7e6afSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 107370a7e6afSSieu Mun Tang status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 107470a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, false, 107570a7e6afSSieu Mun Tang &mbox_error); 107670a7e6afSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 107770a7e6afSSieu Mun Tang 10787e8249a2SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_FINALIZE: 10797e8249a2SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10807e8249a2SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 108170a7e6afSSieu Mun Tang status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 108270a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, true, 108370a7e6afSSieu Mun Tang &mbox_error); 10847e8249a2SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 10857e8249a2SSieu Mun Tang 10864687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_UPDATE: 10874687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10884687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 10894687021dSSieu Mun Tang status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 10904687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, false, 10914687021dSSieu Mun Tang &mbox_error, &send_id); 10924687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 10934687021dSSieu Mun Tang 10944687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_FINALIZE: 10954687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10964687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 10974687021dSSieu Mun Tang status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 10984687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, true, 10994687021dSSieu Mun Tang &mbox_error, &send_id); 11004687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11014687021dSSieu Mun Tang 1102c05ea296SSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_INIT: 1103c05ea296SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1104c05ea296SSieu Mun Tang status = intel_fcs_mac_verify_init(x1, x2, x3, 1105c05ea296SSieu Mun Tang x4, x5, &mbox_error); 1106c05ea296SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1107c05ea296SSieu Mun Tang 110870a7e6afSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_UPDATE: 110970a7e6afSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 111070a7e6afSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 111170a7e6afSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 111270a7e6afSSieu Mun Tang status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 111370a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 111470a7e6afSSieu Mun Tang false, &mbox_error); 111570a7e6afSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 111670a7e6afSSieu Mun Tang 1117c05ea296SSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_FINALIZE: 1118c05ea296SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1119c05ea296SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1120c05ea296SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 112170a7e6afSSieu Mun Tang status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 112270a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 112370a7e6afSSieu Mun Tang true, &mbox_error); 1124c05ea296SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 1125c05ea296SSieu Mun Tang 11264687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_UPDATE: 11274687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11284687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11294687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 11304687021dSSieu Mun Tang status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 11314687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 11324687021dSSieu Mun Tang false, &mbox_error, &send_id); 11334687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11344687021dSSieu Mun Tang 11354687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_FINALIZE: 11364687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11374687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11384687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 11394687021dSSieu Mun Tang status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 11404687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 11414687021dSSieu Mun Tang true, &mbox_error, &send_id); 11424687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11434687021dSSieu Mun Tang 114407912da1SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_INIT: 114507912da1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 114607912da1SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_init(x1, x2, x3, 114707912da1SSieu Mun Tang x4, x5, &mbox_error); 114807912da1SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 114907912da1SSieu Mun Tang 11501d97dd74SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_UPDATE: 11511d97dd74SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11521d97dd74SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11531d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 11541d97dd74SSieu Mun Tang x3, x4, x5, (uint32_t *) &x6, false, 11551d97dd74SSieu Mun Tang &mbox_error); 11561d97dd74SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11571d97dd74SSieu Mun Tang 115807912da1SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_FINALIZE: 115907912da1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 116007912da1SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11611d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 11621d97dd74SSieu Mun Tang x3, x4, x5, (uint32_t *) &x6, true, 11631d97dd74SSieu Mun Tang &mbox_error); 116407912da1SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 116507912da1SSieu Mun Tang 11664687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_UPDATE: 11674687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11684687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11694687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 11704687021dSSieu Mun Tang x2, x3, x4, x5, (uint32_t *) &x6, false, 11714687021dSSieu Mun Tang &mbox_error, &send_id); 11724687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11734687021dSSieu Mun Tang 11744687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_FINALIZE: 11754687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11764687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11774687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 11784687021dSSieu Mun Tang x2, x3, x4, x5, (uint32_t *) &x6, true, 11794687021dSSieu Mun Tang &mbox_error, &send_id); 11804687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11814687021dSSieu Mun Tang 118269254105SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_INIT: 118369254105SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 118469254105SSieu Mun Tang status = intel_fcs_ecdsa_hash_sign_init(x1, x2, x3, 118569254105SSieu Mun Tang x4, x5, &mbox_error); 118669254105SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 118769254105SSieu Mun Tang 118869254105SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_FINALIZE: 118969254105SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 119069254105SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 119169254105SSieu Mun Tang status = intel_fcs_ecdsa_hash_sign_finalize(x1, x2, x3, 119269254105SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 119369254105SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 119469254105SSieu Mun Tang 11957e25eb87SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_INIT: 11967e25eb87SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11977e25eb87SSieu Mun Tang status = intel_fcs_ecdsa_hash_sig_verify_init(x1, x2, x3, 11987e25eb87SSieu Mun Tang x4, x5, &mbox_error); 11997e25eb87SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 12007e25eb87SSieu Mun Tang 12017e25eb87SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_FINALIZE: 12027e25eb87SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12037e25eb87SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12047e25eb87SSieu Mun Tang status = intel_fcs_ecdsa_hash_sig_verify_finalize(x1, x2, x3, 12057e25eb87SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 12067e25eb87SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12077e25eb87SSieu Mun Tang 120858305060SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_INIT: 120958305060SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 121058305060SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_init(x1, x2, x3, 121158305060SSieu Mun Tang x4, x5, &mbox_error); 121258305060SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 121358305060SSieu Mun Tang 12141d97dd74SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_UPDATE: 12151d97dd74SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12161d97dd74SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12171d97dd74SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12181d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 12191d97dd74SSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12201d97dd74SSieu Mun Tang x7, false, &mbox_error); 12211d97dd74SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12221d97dd74SSieu Mun Tang 12234687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_UPDATE: 12244687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12254687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12264687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12274687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 12284687021dSSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12294687021dSSieu Mun Tang x7, false, &mbox_error, &send_id); 12304687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12314687021dSSieu Mun Tang 12324687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_FINALIZE: 12334687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12344687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12354687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12364687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 12374687021dSSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12384687021dSSieu Mun Tang x7, true, &mbox_error, &send_id); 12394687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12404687021dSSieu Mun Tang 124158305060SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_FINALIZE: 124258305060SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 124358305060SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 124458305060SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12451d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 12461d97dd74SSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12471d97dd74SSieu Mun Tang x7, true, &mbox_error); 124858305060SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 124907912da1SSieu Mun Tang 1250d2fee94aSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_INIT: 1251d2fee94aSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1252d2fee94aSSieu Mun Tang status = intel_fcs_ecdsa_get_pubkey_init(x1, x2, x3, 1253d2fee94aSSieu Mun Tang x4, x5, &mbox_error); 1254d2fee94aSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1255d2fee94aSSieu Mun Tang 1256d2fee94aSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_FINALIZE: 1257d2fee94aSSieu Mun Tang status = intel_fcs_ecdsa_get_pubkey_finalize(x1, x2, x3, 1258d2fee94aSSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1259d2fee94aSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1260d2fee94aSSieu Mun Tang 126149446866SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDH_REQUEST_INIT: 126249446866SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 126349446866SSieu Mun Tang status = intel_fcs_ecdh_request_init(x1, x2, x3, 126449446866SSieu Mun Tang x4, x5, &mbox_error); 126549446866SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 126649446866SSieu Mun Tang 126749446866SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDH_REQUEST_FINALIZE: 126849446866SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 126949446866SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 127049446866SSieu Mun Tang status = intel_fcs_ecdh_request_finalize(x1, x2, x3, 127149446866SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 127249446866SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 127349446866SSieu Mun Tang 12746726390eSSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_INIT: 12756726390eSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12766726390eSSieu Mun Tang status = intel_fcs_aes_crypt_init(x1, x2, x3, x4, x5, 12776726390eSSieu Mun Tang &mbox_error); 12786726390eSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 12796726390eSSieu Mun Tang 1280dcb144f1SSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_UPDATE: 1281dcb144f1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1282dcb144f1SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1283dcb144f1SSieu Mun Tang status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1284dcb144f1SSieu Mun Tang x5, x6, false, &send_id); 1285dcb144f1SSieu Mun Tang SMC_RET1(handle, status); 1286dcb144f1SSieu Mun Tang 12876726390eSSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_FINALIZE: 12886726390eSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12896726390eSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1290dcb144f1SSieu Mun Tang status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1291dcb144f1SSieu Mun Tang x5, x6, true, &send_id); 12926726390eSSieu Mun Tang SMC_RET1(handle, status); 12936726390eSSieu Mun Tang 129477902fcaSSieu Mun Tang case INTEL_SIP_SMC_GET_ROM_PATCH_SHA384: 129577902fcaSSieu Mun Tang status = intel_fcs_get_rom_patch_sha384(x1, &retval64, 129677902fcaSSieu Mun Tang &mbox_error); 129777902fcaSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, retval64); 129877902fcaSSieu Mun Tang 1299f0c40b89SSieu Mun Tang case INTEL_SIP_SMC_SVC_VERSION: 1300f0c40b89SSieu Mun Tang SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 1301f0c40b89SSieu Mun Tang SIP_SVC_VERSION_MAJOR, 1302f0c40b89SSieu Mun Tang SIP_SVC_VERSION_MINOR); 1303f0c40b89SSieu Mun Tang 130491239f2cSJit Loon Lim case INTEL_SIP_SMC_SEU_ERR_STATUS: 130591239f2cSJit Loon Lim status = intel_sdm_seu_err_read(seu_respbuf, 130691239f2cSJit Loon Lim ARRAY_SIZE(seu_respbuf)); 130791239f2cSJit Loon Lim if (status) { 130891239f2cSJit Loon Lim SMC_RET1(handle, status); 130991239f2cSJit Loon Lim } else { 131091239f2cSJit Loon Lim SMC_RET3(handle, seu_respbuf[0], seu_respbuf[1], seu_respbuf[2]); 131191239f2cSJit Loon Lim } 131291239f2cSJit Loon Lim 1313fffcb25cSJit Loon Lim case INTEL_SIP_SMC_SAFE_INJECT_SEU_ERR: 1314fffcb25cSJit Loon Lim status = intel_sdm_safe_inject_seu_err((uint32_t *)&x1, (uint32_t)x2); 1315fffcb25cSJit Loon Lim SMC_RET1(handle, status); 1316fffcb25cSJit Loon Lim 1317c76d4239SHadi Asyrafi default: 1318c76d4239SHadi Asyrafi return socfpga_sip_handler(smc_fid, x1, x2, x3, x4, 1319c76d4239SHadi Asyrafi cookie, handle, flags); 1320c76d4239SHadi Asyrafi } 1321c76d4239SHadi Asyrafi } 1322c76d4239SHadi Asyrafi 1323ad47f142SSieu Mun Tang uintptr_t sip_smc_handler(uint32_t smc_fid, 1324ad47f142SSieu Mun Tang u_register_t x1, 1325ad47f142SSieu Mun Tang u_register_t x2, 1326ad47f142SSieu Mun Tang u_register_t x3, 1327ad47f142SSieu Mun Tang u_register_t x4, 1328ad47f142SSieu Mun Tang void *cookie, 1329ad47f142SSieu Mun Tang void *handle, 1330ad47f142SSieu Mun Tang u_register_t flags) 1331ad47f142SSieu Mun Tang { 1332ad47f142SSieu Mun Tang uint32_t cmd = smc_fid & INTEL_SIP_SMC_CMD_MASK; 1333ad47f142SSieu Mun Tang 1334ad47f142SSieu Mun Tang if (cmd >= INTEL_SIP_SMC_CMD_V2_RANGE_BEGIN && 1335ad47f142SSieu Mun Tang cmd <= INTEL_SIP_SMC_CMD_V2_RANGE_END) { 1336ad47f142SSieu Mun Tang return sip_smc_handler_v2(smc_fid, x1, x2, x3, x4, 1337ad47f142SSieu Mun Tang cookie, handle, flags); 1338ad47f142SSieu Mun Tang } else { 1339ad47f142SSieu Mun Tang return sip_smc_handler_v1(smc_fid, x1, x2, x3, x4, 1340ad47f142SSieu Mun Tang cookie, handle, flags); 1341ad47f142SSieu Mun Tang } 1342ad47f142SSieu Mun Tang } 1343ad47f142SSieu Mun Tang 1344c76d4239SHadi Asyrafi DECLARE_RT_SVC( 1345c76d4239SHadi Asyrafi socfpga_sip_svc, 1346c76d4239SHadi Asyrafi OEN_SIP_START, 1347c76d4239SHadi Asyrafi OEN_SIP_END, 1348c76d4239SHadi Asyrafi SMC_TYPE_FAST, 1349c76d4239SHadi Asyrafi NULL, 1350c76d4239SHadi Asyrafi sip_smc_handler 1351c76d4239SHadi Asyrafi ); 1352c76d4239SHadi Asyrafi 1353c76d4239SHadi Asyrafi DECLARE_RT_SVC( 1354c76d4239SHadi Asyrafi socfpga_sip_svc_std, 1355c76d4239SHadi Asyrafi OEN_SIP_START, 1356c76d4239SHadi Asyrafi OEN_SIP_END, 1357c76d4239SHadi Asyrafi SMC_TYPE_YIELD, 1358c76d4239SHadi Asyrafi NULL, 1359c76d4239SHadi Asyrafi sip_smc_handler 1360c76d4239SHadi Asyrafi ); 1361