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; 31ea906b9bSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 32ea906b9bSSieu Mun Tang static uint32_t g_remapper_bypass; 33ea906b9bSSieu Mun Tang #endif 34c76d4239SHadi Asyrafi 35984e236eSSieu Mun Tang /* RSU static variables */ 3644eb782eSChee Hong Ang static uint32_t rsu_dcmf_ver[4] = {0}; 37984e236eSSieu Mun Tang static uint16_t rsu_dcmf_stat[4] = {0}; 38673afd6fSSieu Mun Tang static uint32_t rsu_max_retry; 39c76d4239SHadi Asyrafi 40c76d4239SHadi Asyrafi /* SiP Service UUID */ 41c76d4239SHadi Asyrafi DEFINE_SVC_UUID2(intl_svc_uid, 42c76d4239SHadi Asyrafi 0xa85273b0, 0xe85a, 0x4862, 0xa6, 0x2a, 43c76d4239SHadi Asyrafi 0xfa, 0x88, 0x88, 0x17, 0x68, 0x81); 44c76d4239SHadi Asyrafi 45e5ebe87bSHadi Asyrafi static uint64_t socfpga_sip_handler(uint32_t smc_fid, 46c76d4239SHadi Asyrafi uint64_t x1, 47c76d4239SHadi Asyrafi uint64_t x2, 48c76d4239SHadi Asyrafi uint64_t x3, 49c76d4239SHadi Asyrafi uint64_t x4, 50c76d4239SHadi Asyrafi void *cookie, 51c76d4239SHadi Asyrafi void *handle, 52c76d4239SHadi Asyrafi uint64_t flags) 53c76d4239SHadi Asyrafi { 54c76d4239SHadi Asyrafi ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); 55c76d4239SHadi Asyrafi SMC_RET1(handle, SMC_UNK); 56c76d4239SHadi Asyrafi } 57c76d4239SHadi Asyrafi 58c76d4239SHadi Asyrafi struct fpga_config_info fpga_config_buffers[FPGA_CONFIG_BUFFER_SIZE]; 59c76d4239SHadi Asyrafi 607c58fd4eSHadi Asyrafi static int intel_fpga_sdm_write_buffer(struct fpga_config_info *buffer) 61c76d4239SHadi Asyrafi { 62ea9b9627SAbdul Halim, Muhammad Hadi Asyrafi uint32_t args[3]; 63c76d4239SHadi Asyrafi 64c76d4239SHadi Asyrafi while (max_blocks > 0 && buffer->size > buffer->size_written) { 65c76d4239SHadi Asyrafi args[0] = (1<<8); 66c76d4239SHadi Asyrafi args[1] = buffer->addr + buffer->size_written; 677c58fd4eSHadi Asyrafi if (buffer->size - buffer->size_written <= bytes_per_block) { 68c76d4239SHadi Asyrafi args[2] = buffer->size - buffer->size_written; 69c76d4239SHadi Asyrafi current_buffer++; 70c76d4239SHadi Asyrafi current_buffer %= FPGA_CONFIG_BUFFER_SIZE; 71581182c1SSieu Mun Tang } else { 72c76d4239SHadi Asyrafi args[2] = bytes_per_block; 73581182c1SSieu Mun Tang } 747c58fd4eSHadi Asyrafi 757c58fd4eSHadi Asyrafi buffer->size_written += args[2]; 76aad868b4SAbdul Halim, Muhammad Hadi Asyrafi mailbox_send_cmd_async(&send_id, MBOX_RECONFIG_DATA, args, 77d57318b7SAbdul Halim, Muhammad Hadi Asyrafi 3U, CMD_INDIRECT); 787c58fd4eSHadi Asyrafi 79c76d4239SHadi Asyrafi buffer->subblocks_sent++; 80c76d4239SHadi Asyrafi max_blocks--; 81c76d4239SHadi Asyrafi } 827c58fd4eSHadi Asyrafi 837c58fd4eSHadi Asyrafi return !max_blocks; 84c76d4239SHadi Asyrafi } 85c76d4239SHadi Asyrafi 86c76d4239SHadi Asyrafi static int intel_fpga_sdm_write_all(void) 87c76d4239SHadi Asyrafi { 88581182c1SSieu Mun Tang for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 897c58fd4eSHadi Asyrafi if (intel_fpga_sdm_write_buffer( 90581182c1SSieu Mun Tang &fpga_config_buffers[current_buffer])) { 917c58fd4eSHadi Asyrafi break; 92581182c1SSieu Mun Tang } 93581182c1SSieu Mun Tang } 94c76d4239SHadi Asyrafi return 0; 95c76d4239SHadi Asyrafi } 96c76d4239SHadi Asyrafi 97673afd6fSSieu Mun Tang static uint32_t intel_mailbox_fpga_config_isdone(void) 98c76d4239SHadi Asyrafi { 99dfdd38c2SHadi Asyrafi uint32_t ret; 100dfdd38c2SHadi Asyrafi 101673afd6fSSieu Mun Tang switch (request_type) { 102673afd6fSSieu Mun Tang case RECONFIGURATION: 103673afd6fSSieu Mun Tang ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, 104673afd6fSSieu Mun Tang true); 105673afd6fSSieu Mun Tang break; 106673afd6fSSieu Mun Tang case BITSTREAM_AUTH: 107673afd6fSSieu Mun Tang ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, 108673afd6fSSieu Mun Tang false); 109673afd6fSSieu Mun Tang break; 110673afd6fSSieu Mun Tang default: 111673afd6fSSieu Mun Tang ret = intel_mailbox_get_config_status(MBOX_CONFIG_STATUS, 112673afd6fSSieu Mun Tang false); 113673afd6fSSieu Mun Tang break; 11452cf9c2cSKris Chaplin } 1157c58fd4eSHadi Asyrafi 116e40910e2SAbdul Halim, Muhammad Hadi Asyrafi if (ret != 0U) { 11752cf9c2cSKris Chaplin if (ret == MBOX_CFGSTAT_STATE_CONFIG) { 1187c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_BUSY; 11952cf9c2cSKris Chaplin } else { 120673afd6fSSieu Mun Tang request_type = NO_REQUEST; 1217c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 1227c58fd4eSHadi Asyrafi } 12352cf9c2cSKris Chaplin } 1247c58fd4eSHadi Asyrafi 125673afd6fSSieu Mun Tang if (bridge_disable != 0U) { 12611f4f030SSieu Mun Tang socfpga_bridges_enable(~0); /* Enable bridge */ 127276a4366SSieu Mun Tang bridge_disable = false; 1289c8f3af5SHadi Asyrafi } 129673afd6fSSieu Mun Tang request_type = NO_REQUEST; 1309c8f3af5SHadi Asyrafi 1317c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 132c76d4239SHadi Asyrafi } 133c76d4239SHadi Asyrafi 134c76d4239SHadi Asyrafi static int mark_last_buffer_xfer_completed(uint32_t *buffer_addr_completed) 135c76d4239SHadi Asyrafi { 136c76d4239SHadi Asyrafi int i; 137c76d4239SHadi Asyrafi 138c76d4239SHadi Asyrafi for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 139c76d4239SHadi Asyrafi if (fpga_config_buffers[i].block_number == current_block) { 140c76d4239SHadi Asyrafi fpga_config_buffers[i].subblocks_sent--; 141c76d4239SHadi Asyrafi if (fpga_config_buffers[i].subblocks_sent == 0 142c76d4239SHadi Asyrafi && fpga_config_buffers[i].size <= 143c76d4239SHadi Asyrafi fpga_config_buffers[i].size_written) { 144c76d4239SHadi Asyrafi fpga_config_buffers[i].write_requested = 0; 145c76d4239SHadi Asyrafi current_block++; 146c76d4239SHadi Asyrafi *buffer_addr_completed = 147c76d4239SHadi Asyrafi fpga_config_buffers[i].addr; 148c76d4239SHadi Asyrafi return 0; 149c76d4239SHadi Asyrafi } 150c76d4239SHadi Asyrafi } 151c76d4239SHadi Asyrafi } 152c76d4239SHadi Asyrafi 153c76d4239SHadi Asyrafi return -1; 154c76d4239SHadi Asyrafi } 155c76d4239SHadi Asyrafi 156e5ebe87bSHadi Asyrafi static int intel_fpga_config_completed_write(uint32_t *completed_addr, 157aad868b4SAbdul Halim, Muhammad Hadi Asyrafi uint32_t *count, uint32_t *job_id) 158c76d4239SHadi Asyrafi { 159c76d4239SHadi Asyrafi uint32_t resp[5]; 160a250c04bSSieu Mun Tang unsigned int resp_len = ARRAY_SIZE(resp); 161a250c04bSSieu Mun Tang int status = INTEL_SIP_SMC_STATUS_OK; 162c76d4239SHadi Asyrafi int all_completed = 1; 163a250c04bSSieu Mun Tang *count = 0; 164c76d4239SHadi Asyrafi 165cefb37ebSTien Hock, Loh while (*count < 3) { 166c76d4239SHadi Asyrafi 167a250c04bSSieu Mun Tang status = mailbox_read_response(job_id, 168a250c04bSSieu Mun Tang resp, &resp_len); 169c76d4239SHadi Asyrafi 170286b96f4SSieu Mun Tang if (status < 0) { 171cefb37ebSTien Hock, Loh break; 172286b96f4SSieu Mun Tang } 173c76d4239SHadi Asyrafi 174c76d4239SHadi Asyrafi max_blocks++; 175cefb37ebSTien Hock, Loh 176c76d4239SHadi Asyrafi if (mark_last_buffer_xfer_completed( 177286b96f4SSieu Mun Tang &completed_addr[*count]) == 0) { 178c76d4239SHadi Asyrafi *count = *count + 1; 179286b96f4SSieu Mun Tang } else { 180c76d4239SHadi Asyrafi break; 181c76d4239SHadi Asyrafi } 182286b96f4SSieu Mun Tang } 183c76d4239SHadi Asyrafi 184c76d4239SHadi Asyrafi if (*count <= 0) { 185286b96f4SSieu Mun Tang if (status != MBOX_NO_RESPONSE && 186286b96f4SSieu Mun Tang status != MBOX_TIMEOUT && resp_len != 0) { 187cefb37ebSTien Hock, Loh mailbox_clear_response(); 188673afd6fSSieu Mun Tang request_type = NO_REQUEST; 189c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 190c76d4239SHadi Asyrafi } 191c76d4239SHadi Asyrafi 192c76d4239SHadi Asyrafi *count = 0; 193c76d4239SHadi Asyrafi } 194c76d4239SHadi Asyrafi 195c76d4239SHadi Asyrafi intel_fpga_sdm_write_all(); 196c76d4239SHadi Asyrafi 197581182c1SSieu Mun Tang if (*count > 0) { 198c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_OK; 199581182c1SSieu Mun Tang } else if (*count == 0) { 200c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_BUSY; 201581182c1SSieu Mun Tang } 202c76d4239SHadi Asyrafi 203c76d4239SHadi Asyrafi for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 204c76d4239SHadi Asyrafi if (fpga_config_buffers[i].write_requested != 0) { 205c76d4239SHadi Asyrafi all_completed = 0; 206c76d4239SHadi Asyrafi break; 207c76d4239SHadi Asyrafi } 208c76d4239SHadi Asyrafi } 209c76d4239SHadi Asyrafi 210581182c1SSieu Mun Tang if (all_completed == 1) { 211c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 212581182c1SSieu Mun Tang } 213c76d4239SHadi Asyrafi 214c76d4239SHadi Asyrafi return status; 215c76d4239SHadi Asyrafi } 216c76d4239SHadi Asyrafi 217276a4366SSieu Mun Tang static int intel_fpga_config_start(uint32_t flag) 218c76d4239SHadi Asyrafi { 219a250c04bSSieu Mun Tang uint32_t argument = 0x1; 220c76d4239SHadi Asyrafi uint32_t response[3]; 221c76d4239SHadi Asyrafi int status = 0; 222a250c04bSSieu Mun Tang unsigned int size = 0; 223a250c04bSSieu Mun Tang unsigned int resp_len = ARRAY_SIZE(response); 224c76d4239SHadi Asyrafi 225*6ce576c6SSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 226*6ce576c6SSieu Mun Tang /* 227*6ce576c6SSieu Mun Tang * To trigger isolation 228*6ce576c6SSieu Mun Tang * FPGA configuration complete signal should be de-asserted 229*6ce576c6SSieu Mun Tang */ 230*6ce576c6SSieu Mun Tang INFO("SOCFPGA: Request SDM to trigger isolation\n"); 231*6ce576c6SSieu Mun Tang status = mailbox_send_fpga_config_comp(); 232*6ce576c6SSieu Mun Tang 233*6ce576c6SSieu Mun Tang if (status < 0) { 234*6ce576c6SSieu Mun Tang INFO("SOCFPGA: Isolation for FPGA configuration complete is not executed\n"); 235*6ce576c6SSieu Mun Tang } 236*6ce576c6SSieu Mun Tang #endif 237*6ce576c6SSieu Mun Tang 238673afd6fSSieu Mun Tang request_type = RECONFIGURATION; 239673afd6fSSieu Mun Tang 240276a4366SSieu Mun Tang if (!CONFIG_TEST_FLAG(flag, PARTIAL_CONFIG)) { 241276a4366SSieu Mun Tang bridge_disable = true; 242276a4366SSieu Mun Tang } 243276a4366SSieu Mun Tang 244276a4366SSieu Mun Tang if (CONFIG_TEST_FLAG(flag, AUTHENTICATION)) { 245276a4366SSieu Mun Tang size = 1; 246276a4366SSieu Mun Tang bridge_disable = false; 247673afd6fSSieu Mun Tang request_type = BITSTREAM_AUTH; 248ec4f28ecSAbdul Halim, Muhammad Hadi Asyrafi } 2499c8f3af5SHadi Asyrafi 250b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 251b727664eSSieu Mun Tang intel_smmu_hps_remapper_init(0U); 252b727664eSSieu Mun Tang #endif 253b727664eSSieu Mun Tang 254cefb37ebSTien Hock, Loh mailbox_clear_response(); 255cefb37ebSTien Hock, Loh 256a250c04bSSieu Mun Tang mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_CANCEL, NULL, 0U, 257a250c04bSSieu Mun Tang CMD_CASUAL, NULL, NULL); 258cefb37ebSTien Hock, Loh 259a250c04bSSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_RECONFIG, &argument, size, 260a250c04bSSieu Mun Tang CMD_CASUAL, response, &resp_len); 261c76d4239SHadi Asyrafi 262e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi if (status < 0) { 263276a4366SSieu Mun Tang bridge_disable = false; 264673afd6fSSieu Mun Tang request_type = NO_REQUEST; 265e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 266e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi } 267c76d4239SHadi Asyrafi 268c76d4239SHadi Asyrafi max_blocks = response[0]; 269c76d4239SHadi Asyrafi bytes_per_block = response[1]; 270c76d4239SHadi Asyrafi 271c76d4239SHadi Asyrafi for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 272c76d4239SHadi Asyrafi fpga_config_buffers[i].size = 0; 273c76d4239SHadi Asyrafi fpga_config_buffers[i].size_written = 0; 274c76d4239SHadi Asyrafi fpga_config_buffers[i].addr = 0; 275c76d4239SHadi Asyrafi fpga_config_buffers[i].write_requested = 0; 276c76d4239SHadi Asyrafi fpga_config_buffers[i].block_number = 0; 277c76d4239SHadi Asyrafi fpga_config_buffers[i].subblocks_sent = 0; 278c76d4239SHadi Asyrafi } 279c76d4239SHadi Asyrafi 280c76d4239SHadi Asyrafi blocks_submitted = 0; 281c76d4239SHadi Asyrafi current_block = 0; 282cefb37ebSTien Hock, Loh read_block = 0; 283c76d4239SHadi Asyrafi current_buffer = 0; 284c76d4239SHadi Asyrafi 285276a4366SSieu Mun Tang /* Disable bridge on full reconfiguration */ 286276a4366SSieu Mun Tang if (bridge_disable) { 28711f4f030SSieu Mun Tang socfpga_bridges_disable(~0); 2889c8f3af5SHadi Asyrafi } 2899c8f3af5SHadi Asyrafi 290e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 291c76d4239SHadi Asyrafi } 292c76d4239SHadi Asyrafi 2937c58fd4eSHadi Asyrafi static bool is_fpga_config_buffer_full(void) 2947c58fd4eSHadi Asyrafi { 295581182c1SSieu Mun Tang for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 296581182c1SSieu Mun Tang if (!fpga_config_buffers[i].write_requested) { 2977c58fd4eSHadi Asyrafi return false; 298581182c1SSieu Mun Tang } 299581182c1SSieu Mun Tang } 3007c58fd4eSHadi Asyrafi return true; 3017c58fd4eSHadi Asyrafi } 3027c58fd4eSHadi Asyrafi 303aad868b4SAbdul Halim, Muhammad Hadi Asyrafi bool is_address_in_ddr_range(uint64_t addr, uint64_t size) 3047c58fd4eSHadi Asyrafi { 305f4aaa9fdSSieu Mun Tang uint128_t dram_max_sz = (uint128_t)DRAM_BASE + (uint128_t)DRAM_SIZE; 306f4aaa9fdSSieu Mun Tang uint128_t dram_region_end = (uint128_t)addr + (uint128_t)size; 307f4aaa9fdSSieu Mun Tang 30812d71ac6SAbdul Halim, Muhammad Hadi Asyrafi if (!addr && !size) { 30912d71ac6SAbdul Halim, Muhammad Hadi Asyrafi return true; 31012d71ac6SAbdul Halim, Muhammad Hadi Asyrafi } 311581182c1SSieu Mun Tang if (size > (UINT64_MAX - addr)) { 3127c58fd4eSHadi Asyrafi return false; 313581182c1SSieu Mun Tang } 314581182c1SSieu Mun Tang if (addr < BL31_LIMIT) { 3151a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return false; 316581182c1SSieu Mun Tang } 317f4aaa9fdSSieu Mun Tang if (dram_region_end > dram_max_sz) { 3181a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return false; 319581182c1SSieu Mun Tang } 3201a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 3211a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return true; 3227c58fd4eSHadi Asyrafi } 323c76d4239SHadi Asyrafi 324e5ebe87bSHadi Asyrafi static uint32_t intel_fpga_config_write(uint64_t mem, uint64_t size) 325c76d4239SHadi Asyrafi { 3267c58fd4eSHadi Asyrafi int i; 327c76d4239SHadi Asyrafi 3287c58fd4eSHadi Asyrafi intel_fpga_sdm_write_all(); 329c76d4239SHadi Asyrafi 3301a87db5dSAbdul Halim, Muhammad Hadi Asyrafi if (!is_address_in_ddr_range(mem, size) || 331ef51b097SAbdul Halim, Muhammad Hadi Asyrafi is_fpga_config_buffer_full()) { 3327c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_REJECTED; 333ef51b097SAbdul Halim, Muhammad Hadi Asyrafi } 334c76d4239SHadi Asyrafi 335b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 336b727664eSSieu Mun Tang intel_smmu_hps_remapper_init(&mem); 337b727664eSSieu Mun Tang #endif 338b727664eSSieu Mun Tang 339c76d4239SHadi Asyrafi for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 3407c58fd4eSHadi Asyrafi int j = (i + current_buffer) % FPGA_CONFIG_BUFFER_SIZE; 3417c58fd4eSHadi Asyrafi 3427c58fd4eSHadi Asyrafi if (!fpga_config_buffers[j].write_requested) { 3437c58fd4eSHadi Asyrafi fpga_config_buffers[j].addr = mem; 3447c58fd4eSHadi Asyrafi fpga_config_buffers[j].size = size; 3457c58fd4eSHadi Asyrafi fpga_config_buffers[j].size_written = 0; 3467c58fd4eSHadi Asyrafi fpga_config_buffers[j].write_requested = 1; 3477c58fd4eSHadi Asyrafi fpga_config_buffers[j].block_number = 348c76d4239SHadi Asyrafi blocks_submitted++; 3497c58fd4eSHadi Asyrafi fpga_config_buffers[j].subblocks_sent = 0; 350c76d4239SHadi Asyrafi break; 351c76d4239SHadi Asyrafi } 352c76d4239SHadi Asyrafi } 353c76d4239SHadi Asyrafi 354ef51b097SAbdul Halim, Muhammad Hadi Asyrafi if (is_fpga_config_buffer_full()) { 3557c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_BUSY; 356ef51b097SAbdul Halim, Muhammad Hadi Asyrafi } 357c76d4239SHadi Asyrafi 3587c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 359c76d4239SHadi Asyrafi } 360c76d4239SHadi Asyrafi 36113d33d52SHadi Asyrafi static int is_out_of_sec_range(uint64_t reg_addr) 36213d33d52SHadi Asyrafi { 3637e954dfcSSiew Chin Lim #if DEBUG 3647e954dfcSSiew Chin Lim return 0; 3657e954dfcSSiew Chin Lim #endif 3667e954dfcSSiew Chin Lim 3678e59b9f4SJit Loon Lim #if PLATFORM_MODEL != PLAT_SOCFPGA_AGILEX5 36813d33d52SHadi Asyrafi switch (reg_addr) { 36913d33d52SHadi Asyrafi case(0xF8011100): /* ECCCTRL1 */ 37013d33d52SHadi Asyrafi case(0xF8011104): /* ECCCTRL2 */ 37113d33d52SHadi Asyrafi case(0xF8011110): /* ERRINTEN */ 37213d33d52SHadi Asyrafi case(0xF8011114): /* ERRINTENS */ 37313d33d52SHadi Asyrafi case(0xF8011118): /* ERRINTENR */ 37413d33d52SHadi Asyrafi case(0xF801111C): /* INTMODE */ 37513d33d52SHadi Asyrafi case(0xF8011120): /* INTSTAT */ 37613d33d52SHadi Asyrafi case(0xF8011124): /* DIAGINTTEST */ 37713d33d52SHadi Asyrafi case(0xF801112C): /* DERRADDRA */ 3784687021dSSieu Mun Tang case(0xFA000000): /* SMMU SCR0 */ 3794687021dSSieu Mun Tang case(0xFA000004): /* SMMU SCR1 */ 3804687021dSSieu Mun Tang case(0xFA000400): /* SMMU NSCR0 */ 3814687021dSSieu Mun Tang case(0xFA004000): /* SMMU SSD0_REG */ 3824687021dSSieu Mun Tang case(0xFA000820): /* SMMU SMR8 */ 3834687021dSSieu Mun Tang case(0xFA000c20): /* SMMU SCR8 */ 3844687021dSSieu Mun Tang case(0xFA028000): /* SMMU CB8_SCTRL */ 3854687021dSSieu Mun Tang case(0xFA001020): /* SMMU CBAR8 */ 3864687021dSSieu Mun Tang case(0xFA028030): /* SMMU TCR_LPAE */ 3874687021dSSieu Mun Tang case(0xFA028020): /* SMMU CB8_TTBR0_LOW */ 3884687021dSSieu Mun Tang case(0xFA028024): /* SMMU CB8_PRRR_HIGH */ 3894687021dSSieu Mun Tang case(0xFA028038): /* SMMU CB8_PRRR_MIR0 */ 3904687021dSSieu Mun Tang case(0xFA02803C): /* SMMU CB8_PRRR_MIR1 */ 3914687021dSSieu Mun Tang case(0xFA028010): /* SMMU_CB8)TCR2 */ 3924687021dSSieu Mun Tang case(0xFFD080A4): /* SDM SMMU STREAM ID REG */ 3934687021dSSieu Mun Tang case(0xFA001820): /* SMMU_CBA2R8 */ 3944687021dSSieu Mun Tang case(0xFA000074): /* SMMU_STLBGSTATUS */ 3954687021dSSieu Mun Tang case(0xFA0287F4): /* SMMU_CB8_TLBSTATUS */ 3964687021dSSieu Mun Tang case(0xFA000060): /* SMMU_STLBIALL */ 3974687021dSSieu Mun Tang case(0xFA000070): /* SMMU_STLBGSYNC */ 3984687021dSSieu Mun Tang case(0xFA028618): /* CB8_TLBALL */ 3994687021dSSieu Mun Tang case(0xFA0287F0): /* CB8_TLBSYNC */ 40013d33d52SHadi Asyrafi case(0xFFD12028): /* SDMMCGRP_CTRL */ 40113d33d52SHadi Asyrafi case(0xFFD12044): /* EMAC0 */ 40213d33d52SHadi Asyrafi case(0xFFD12048): /* EMAC1 */ 40313d33d52SHadi Asyrafi case(0xFFD1204C): /* EMAC2 */ 40413d33d52SHadi Asyrafi case(0xFFD12090): /* ECC_INT_MASK_VALUE */ 40513d33d52SHadi Asyrafi case(0xFFD12094): /* ECC_INT_MASK_SET */ 40613d33d52SHadi Asyrafi case(0xFFD12098): /* ECC_INT_MASK_CLEAR */ 40713d33d52SHadi Asyrafi case(0xFFD1209C): /* ECC_INTSTATUS_SERR */ 40813d33d52SHadi Asyrafi case(0xFFD120A0): /* ECC_INTSTATUS_DERR */ 40913d33d52SHadi Asyrafi case(0xFFD120C0): /* NOC_TIMEOUT */ 41013d33d52SHadi Asyrafi case(0xFFD120C4): /* NOC_IDLEREQ_SET */ 41113d33d52SHadi Asyrafi case(0xFFD120C8): /* NOC_IDLEREQ_CLR */ 41213d33d52SHadi Asyrafi case(0xFFD120D0): /* NOC_IDLEACK */ 41313d33d52SHadi Asyrafi case(0xFFD120D4): /* NOC_IDLESTATUS */ 41413d33d52SHadi Asyrafi case(0xFFD12200): /* BOOT_SCRATCH_COLD0 */ 41513d33d52SHadi Asyrafi case(0xFFD12204): /* BOOT_SCRATCH_COLD1 */ 41613d33d52SHadi Asyrafi case(0xFFD12220): /* BOOT_SCRATCH_COLD8 */ 41713d33d52SHadi Asyrafi case(0xFFD12224): /* BOOT_SCRATCH_COLD9 */ 41813d33d52SHadi Asyrafi return 0; 4198e59b9f4SJit Loon Lim #else 4208e59b9f4SJit Loon Lim switch (reg_addr) { 42113d33d52SHadi Asyrafi 4228e59b9f4SJit Loon Lim case(0xF8011104): /* ECCCTRL2 */ 4238e59b9f4SJit Loon Lim case(0xFFD12028): /* SDMMCGRP_CTRL */ 4248e59b9f4SJit Loon Lim case(0xFFD120C4): /* NOC_IDLEREQ_SET */ 4258e59b9f4SJit Loon Lim case(0xFFD120C8): /* NOC_IDLEREQ_CLR */ 4268e59b9f4SJit Loon Lim case(0xFFD120D0): /* NOC_IDLEACK */ 4278e59b9f4SJit Loon Lim 4288e59b9f4SJit Loon Lim 4298e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ECCCTRL1)): /* ECCCTRL1 */ 4308e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ERRINTEN)): /* ERRINTEN */ 4318e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ERRINTENS)): /* ERRINTENS */ 4328e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ERRINTENR)): /* ERRINTENR */ 4338e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(INTMODE)): /* INTMODE */ 4348e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(INTSTAT)): /* INTSTAT */ 4358e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(DIAGINTTEST)): /* DIAGINTTEST */ 4368e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(DERRADDRA)): /* DERRADDRA */ 4378e59b9f4SJit Loon Lim 43846839460SJit Loon Lim case(SOCFPGA_ECC_QSPI(INITSTAT)): /* ECC_QSPI_INITSTAT */ 4398e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_0)): /* EMAC0 */ 4408e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_1)): /* EMAC1 */ 4418e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_2)): /* EMAC2 */ 4428e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_VALUE)): /* ECC_INT_MASK_VALUE */ 4438e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_SET)): /* ECC_INT_MASK_SET */ 4448e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_CLR)): /* ECC_INT_MASK_CLEAR */ 4458e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_SERR)): /* ECC_INTSTATUS_SERR */ 4468e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_DERR)): /* ECC_INTSTATUS_DERR */ 4478e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(NOC_TIMEOUT)): /* NOC_TIMEOUT */ 4488e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(NOC_IDLESTATUS)): /* NOC_IDLESTATUS */ 4498e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_0)): /* BOOT_SCRATCH_COLD0 */ 4508e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_1)): /* BOOT_SCRATCH_COLD1 */ 4518e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_8)): /* BOOT_SCRATCH_COLD8 */ 4528e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_9)): /* BOOT_SCRATCH_COLD9 */ 4538e59b9f4SJit Loon Lim #endif 4544d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(CTRL)): /* ECC_QSPI_CTRL */ 4554d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTEN)): /* ECC_QSPI_ERRINTEN */ 4564d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTENS)): /* ECC_QSPI_ERRINTENS */ 4574d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTENR)): /* ECC_QSPI_ERRINTENR */ 4584d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTMODE)): /* ECC_QSPI_INTMODE */ 4594d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_ACCCTRL)): /* ECC_QSPI_ECC_ACCCTRL */ 4604d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_STARTACC)): /* ECC_QSPI_ECC_STARTACC */ 4614d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_WDCTRL)): /* ECC_QSPI_ECC_WDCTRL */ 4624d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTSTAT)): /* ECC_QSPI_INTSTAT */ 4634d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTTEST)): /* ECC_QSPI_INTMODE */ 46413d33d52SHadi Asyrafi return 0; 465d6ae69c8SSieu Mun Tang 46613d33d52SHadi Asyrafi default: 46713d33d52SHadi Asyrafi break; 46813d33d52SHadi Asyrafi } 46913d33d52SHadi Asyrafi 47013d33d52SHadi Asyrafi return -1; 47113d33d52SHadi Asyrafi } 47213d33d52SHadi Asyrafi 47313d33d52SHadi Asyrafi /* Secure register access */ 47413d33d52SHadi Asyrafi uint32_t intel_secure_reg_read(uint64_t reg_addr, uint32_t *retval) 47513d33d52SHadi Asyrafi { 47613d33d52SHadi Asyrafi if (is_out_of_sec_range(reg_addr)) { 47713d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 47813d33d52SHadi Asyrafi } 47913d33d52SHadi Asyrafi 48013d33d52SHadi Asyrafi *retval = mmio_read_32(reg_addr); 48113d33d52SHadi Asyrafi 48213d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 48313d33d52SHadi Asyrafi } 48413d33d52SHadi Asyrafi 48513d33d52SHadi Asyrafi uint32_t intel_secure_reg_write(uint64_t reg_addr, uint32_t val, 48613d33d52SHadi Asyrafi uint32_t *retval) 48713d33d52SHadi Asyrafi { 48813d33d52SHadi Asyrafi if (is_out_of_sec_range(reg_addr)) { 48913d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 49013d33d52SHadi Asyrafi } 49113d33d52SHadi Asyrafi 4924d122e5fSJit Loon Lim switch (reg_addr) { 4934d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTSTAT)): /* ECC_QSPI_INTSTAT */ 4944d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTTEST)): /* ECC_QSPI_INTMODE */ 4954d122e5fSJit Loon Lim mmio_write_16(reg_addr, val); 4964d122e5fSJit Loon Lim break; 4974d122e5fSJit Loon Lim default: 49813d33d52SHadi Asyrafi mmio_write_32(reg_addr, val); 4994d122e5fSJit Loon Lim break; 5004d122e5fSJit Loon Lim } 50113d33d52SHadi Asyrafi 50213d33d52SHadi Asyrafi return intel_secure_reg_read(reg_addr, retval); 50313d33d52SHadi Asyrafi } 50413d33d52SHadi Asyrafi 50513d33d52SHadi Asyrafi uint32_t intel_secure_reg_update(uint64_t reg_addr, uint32_t mask, 50613d33d52SHadi Asyrafi uint32_t val, uint32_t *retval) 50713d33d52SHadi Asyrafi { 50813d33d52SHadi Asyrafi if (!intel_secure_reg_read(reg_addr, retval)) { 50913d33d52SHadi Asyrafi *retval &= ~mask; 510c9c07099SSiew Chin Lim *retval |= val & mask; 51113d33d52SHadi Asyrafi return intel_secure_reg_write(reg_addr, *retval, retval); 51213d33d52SHadi Asyrafi } 51313d33d52SHadi Asyrafi 51413d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 51513d33d52SHadi Asyrafi } 51613d33d52SHadi Asyrafi 517e1f97d9cSHadi Asyrafi /* Intel Remote System Update (RSU) services */ 518e1f97d9cSHadi Asyrafi uint64_t intel_rsu_update_address; 519e1f97d9cSHadi Asyrafi 520d57318b7SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_rsu_status(uint64_t *respbuf, unsigned int respbuf_sz) 521e1f97d9cSHadi Asyrafi { 522581182c1SSieu Mun Tang if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 523960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 524581182c1SSieu Mun Tang } 525e1f97d9cSHadi Asyrafi 526e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 527e1f97d9cSHadi Asyrafi } 528e1f97d9cSHadi Asyrafi 5298fb1b484SKah Jing Lee static uint32_t intel_rsu_get_device_info(uint32_t *respbuf, 5308fb1b484SKah Jing Lee unsigned int respbuf_sz) 5318fb1b484SKah Jing Lee { 5328fb1b484SKah Jing Lee if (mailbox_rsu_get_device_info((uint32_t *)respbuf, respbuf_sz) < 0) { 5338fb1b484SKah Jing Lee return INTEL_SIP_SMC_RSU_ERROR; 5348fb1b484SKah Jing Lee } 5358fb1b484SKah Jing Lee 5368fb1b484SKah Jing Lee return INTEL_SIP_SMC_STATUS_OK; 5378fb1b484SKah Jing Lee } 5388fb1b484SKah Jing Lee 539e3c3a48cSMahesh Rao uint32_t intel_rsu_update(uint64_t update_address) 540e1f97d9cSHadi Asyrafi { 541c418064eSJit Loon Lim if (update_address > SIZE_MAX) { 542c418064eSJit Loon Lim return INTEL_SIP_SMC_STATUS_REJECTED; 543c418064eSJit Loon Lim } 544c418064eSJit Loon Lim 545e1f97d9cSHadi Asyrafi intel_rsu_update_address = update_address; 546e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 547e1f97d9cSHadi Asyrafi } 548e1f97d9cSHadi Asyrafi 549ea9b9627SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_rsu_notify(uint32_t execution_stage) 550e1f97d9cSHadi Asyrafi { 551581182c1SSieu Mun Tang if (mailbox_hps_stage_notify(execution_stage) < 0) { 552960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 553581182c1SSieu Mun Tang } 554e1f97d9cSHadi Asyrafi 555e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 556e1f97d9cSHadi Asyrafi } 557e1f97d9cSHadi Asyrafi 558e1f97d9cSHadi Asyrafi static uint32_t intel_rsu_retry_counter(uint32_t *respbuf, uint32_t respbuf_sz, 559e1f97d9cSHadi Asyrafi uint32_t *ret_stat) 560e1f97d9cSHadi Asyrafi { 561581182c1SSieu Mun Tang if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 562960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 563581182c1SSieu Mun Tang } 564e1f97d9cSHadi Asyrafi 565e1f97d9cSHadi Asyrafi *ret_stat = respbuf[8]; 566e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 567e1f97d9cSHadi Asyrafi } 568e1f97d9cSHadi Asyrafi 56944eb782eSChee Hong Ang static uint32_t intel_rsu_copy_dcmf_version(uint64_t dcmf_ver_1_0, 57044eb782eSChee Hong Ang uint64_t dcmf_ver_3_2) 57144eb782eSChee Hong Ang { 57244eb782eSChee Hong Ang rsu_dcmf_ver[0] = dcmf_ver_1_0; 57344eb782eSChee Hong Ang rsu_dcmf_ver[1] = dcmf_ver_1_0 >> 32; 57444eb782eSChee Hong Ang rsu_dcmf_ver[2] = dcmf_ver_3_2; 57544eb782eSChee Hong Ang rsu_dcmf_ver[3] = dcmf_ver_3_2 >> 32; 57644eb782eSChee Hong Ang 57744eb782eSChee Hong Ang return INTEL_SIP_SMC_STATUS_OK; 57844eb782eSChee Hong Ang } 57944eb782eSChee Hong Ang 580984e236eSSieu Mun Tang static uint32_t intel_rsu_copy_dcmf_status(uint64_t dcmf_stat) 581984e236eSSieu Mun Tang { 582984e236eSSieu Mun Tang rsu_dcmf_stat[0] = 0xFFFF & (dcmf_stat >> (0 * 16)); 583984e236eSSieu Mun Tang rsu_dcmf_stat[1] = 0xFFFF & (dcmf_stat >> (1 * 16)); 584984e236eSSieu Mun Tang rsu_dcmf_stat[2] = 0xFFFF & (dcmf_stat >> (2 * 16)); 585984e236eSSieu Mun Tang rsu_dcmf_stat[3] = 0xFFFF & (dcmf_stat >> (3 * 16)); 586984e236eSSieu Mun Tang 587984e236eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 588984e236eSSieu Mun Tang } 589984e236eSSieu Mun Tang 59052cf9c2cSKris Chaplin /* Intel HWMON services */ 59152cf9c2cSKris Chaplin static uint32_t intel_hwmon_readtemp(uint32_t chan, uint32_t *retval) 59252cf9c2cSKris Chaplin { 59352cf9c2cSKris Chaplin if (mailbox_hwmon_readtemp(chan, retval) < 0) { 59452cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_ERROR; 59552cf9c2cSKris Chaplin } 59652cf9c2cSKris Chaplin 59752cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_OK; 59852cf9c2cSKris Chaplin } 59952cf9c2cSKris Chaplin 60052cf9c2cSKris Chaplin static uint32_t intel_hwmon_readvolt(uint32_t chan, uint32_t *retval) 60152cf9c2cSKris Chaplin { 60252cf9c2cSKris Chaplin if (mailbox_hwmon_readvolt(chan, retval) < 0) { 60352cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_ERROR; 60452cf9c2cSKris Chaplin } 60552cf9c2cSKris Chaplin 60652cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_OK; 60752cf9c2cSKris Chaplin } 60852cf9c2cSKris Chaplin 6090c5d62adSHadi Asyrafi /* Mailbox services */ 610c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_smc_fw_version(uint32_t *fw_version) 611c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi { 612c026dfe3SSieu Mun Tang int status; 613c026dfe3SSieu Mun Tang unsigned int resp_len = CONFIG_STATUS_WORD_SIZE; 614c026dfe3SSieu Mun Tang uint32_t resp_data[CONFIG_STATUS_WORD_SIZE] = {0U}; 615c026dfe3SSieu Mun Tang 616c026dfe3SSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CONFIG_STATUS, NULL, 0U, 617c026dfe3SSieu Mun Tang CMD_CASUAL, resp_data, &resp_len); 618c026dfe3SSieu Mun Tang 619c026dfe3SSieu Mun Tang if (status < 0) { 620c026dfe3SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 621c026dfe3SSieu Mun Tang } 622c026dfe3SSieu Mun Tang 623c026dfe3SSieu Mun Tang if (resp_len <= CONFIG_STATUS_FW_VER_OFFSET) { 624c026dfe3SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 625c026dfe3SSieu Mun Tang } 626c026dfe3SSieu Mun Tang 627c026dfe3SSieu Mun Tang *fw_version = resp_data[CONFIG_STATUS_FW_VER_OFFSET] & CONFIG_STATUS_FW_VER_MASK; 628c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 629c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 630c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi } 631c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 632a250c04bSSieu Mun Tang static uint32_t intel_mbox_send_cmd(uint32_t cmd, uint32_t *args, 633ac097fdfSSieu Mun Tang unsigned int len, uint32_t urgent, uint64_t response, 634a250c04bSSieu Mun Tang unsigned int resp_len, int *mbox_status, 635a250c04bSSieu Mun Tang unsigned int *len_in_resp) 6360c5d62adSHadi Asyrafi { 6371a87db5dSAbdul Halim, Muhammad Hadi Asyrafi *len_in_resp = 0; 638651841f2SSieu Mun Tang *mbox_status = GENERIC_RESPONSE_ERROR; 6391a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 640581182c1SSieu Mun Tang if (!is_address_in_ddr_range((uint64_t)args, sizeof(uint32_t) * len)) { 6411a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_REJECTED; 642581182c1SSieu Mun Tang } 6431a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 6440c5d62adSHadi Asyrafi int status = mailbox_send_cmd(MBOX_JOB_ID, cmd, args, len, urgent, 645ac097fdfSSieu Mun Tang (uint32_t *) response, &resp_len); 6460c5d62adSHadi Asyrafi 6470c5d62adSHadi Asyrafi if (status < 0) { 6480c5d62adSHadi Asyrafi *mbox_status = -status; 6490c5d62adSHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 6500c5d62adSHadi Asyrafi } 6510c5d62adSHadi Asyrafi 6520c5d62adSHadi Asyrafi *mbox_status = 0; 653a250c04bSSieu Mun Tang *len_in_resp = resp_len; 654ac097fdfSSieu Mun Tang 655ac097fdfSSieu Mun Tang flush_dcache_range(response, resp_len * MBOX_WORD_BYTE); 656ac097fdfSSieu Mun Tang 6570c5d62adSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 6580c5d62adSHadi Asyrafi } 6590c5d62adSHadi Asyrafi 66093a5b97eSSieu Mun Tang static int intel_smc_get_usercode(uint32_t *user_code) 66193a5b97eSSieu Mun Tang { 66293a5b97eSSieu Mun Tang int status; 66393a5b97eSSieu Mun Tang unsigned int resp_len = sizeof(user_code) / MBOX_WORD_BYTE; 66493a5b97eSSieu Mun Tang 66593a5b97eSSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_GET_USERCODE, NULL, 66693a5b97eSSieu Mun Tang 0U, CMD_CASUAL, user_code, &resp_len); 66793a5b97eSSieu Mun Tang 66893a5b97eSSieu Mun Tang if (status < 0) { 66993a5b97eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 67093a5b97eSSieu Mun Tang } 67193a5b97eSSieu Mun Tang 67293a5b97eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 67393a5b97eSSieu Mun Tang } 67493a5b97eSSieu Mun Tang 6754837a640SSieu Mun Tang uint32_t intel_smc_service_completed(uint64_t addr, uint32_t size, 6764837a640SSieu Mun Tang uint32_t mode, uint32_t *job_id, 6774837a640SSieu Mun Tang uint32_t *ret_size, uint32_t *mbox_error) 6784837a640SSieu Mun Tang { 6794837a640SSieu Mun Tang int status = 0; 6804837a640SSieu Mun Tang uint32_t resp_len = size / MBOX_WORD_BYTE; 6814837a640SSieu Mun Tang 6824837a640SSieu Mun Tang if (resp_len > MBOX_DATA_MAX_LEN) { 6834837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_REJECTED; 6844837a640SSieu Mun Tang } 6854837a640SSieu Mun Tang 6864837a640SSieu Mun Tang if (!is_address_in_ddr_range(addr, size)) { 6874837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_REJECTED; 6884837a640SSieu Mun Tang } 6894837a640SSieu Mun Tang 6904837a640SSieu Mun Tang if (mode == SERVICE_COMPLETED_MODE_ASYNC) { 6914837a640SSieu Mun Tang status = mailbox_read_response_async(job_id, 6924837a640SSieu Mun Tang NULL, (uint32_t *) addr, &resp_len, 0); 6934837a640SSieu Mun Tang } else { 6944837a640SSieu Mun Tang status = mailbox_read_response(job_id, 6954837a640SSieu Mun Tang (uint32_t *) addr, &resp_len); 6964837a640SSieu Mun Tang 6974837a640SSieu Mun Tang if (status == MBOX_NO_RESPONSE) { 6984837a640SSieu Mun Tang status = MBOX_BUSY; 6994837a640SSieu Mun Tang } 7004837a640SSieu Mun Tang } 7014837a640SSieu Mun Tang 7024837a640SSieu Mun Tang if (status == MBOX_NO_RESPONSE) { 7034837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_NO_RESPONSE; 7044837a640SSieu Mun Tang } 7054837a640SSieu Mun Tang 7064837a640SSieu Mun Tang if (status == MBOX_BUSY) { 7074837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_BUSY; 7084837a640SSieu Mun Tang } 7094837a640SSieu Mun Tang 7104837a640SSieu Mun Tang *ret_size = resp_len * MBOX_WORD_BYTE; 7114837a640SSieu Mun Tang flush_dcache_range(addr, *ret_size); 7124837a640SSieu Mun Tang 71376ed3223SSieu Mun Tang if (status == MBOX_RET_SDOS_DECRYPTION_ERROR_102 || 71476ed3223SSieu Mun Tang status == MBOX_RET_SDOS_DECRYPTION_ERROR_103) { 71576ed3223SSieu Mun Tang *mbox_error = -status; 71676ed3223SSieu Mun Tang } else if (status != MBOX_RET_OK) { 7174837a640SSieu Mun Tang *mbox_error = -status; 7184837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 7194837a640SSieu Mun Tang } 7204837a640SSieu Mun Tang 7214837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 7224837a640SSieu Mun Tang } 7234837a640SSieu Mun Tang 724b703facaSSieu Mun Tang /* Miscellaneous HPS services */ 725b703facaSSieu Mun Tang uint32_t intel_hps_set_bridges(uint64_t enable, uint64_t mask) 726b703facaSSieu Mun Tang { 727b703facaSSieu Mun Tang int status = 0; 728b703facaSSieu Mun Tang 729ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_ENABLE) != 0U) { 730ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 731b703facaSSieu Mun Tang status = socfpga_bridges_enable((uint32_t)mask); 732b703facaSSieu Mun Tang } else { 733b703facaSSieu Mun Tang status = socfpga_bridges_enable(~0); 734b703facaSSieu Mun Tang } 735b703facaSSieu Mun Tang } else { 736ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 737b703facaSSieu Mun Tang status = socfpga_bridges_disable((uint32_t)mask); 738b703facaSSieu Mun Tang } else { 739b703facaSSieu Mun Tang status = socfpga_bridges_disable(~0); 740b703facaSSieu Mun Tang } 741b703facaSSieu Mun Tang } 742b703facaSSieu Mun Tang 743b703facaSSieu Mun Tang if (status < 0) { 744b703facaSSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 745b703facaSSieu Mun Tang } 746b703facaSSieu Mun Tang 747b703facaSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 748b703facaSSieu Mun Tang } 749b703facaSSieu Mun Tang 75091239f2cSJit Loon Lim /* SDM SEU Error services */ 751fffcb25cSJit Loon Lim static uint32_t intel_sdm_seu_err_read(uint32_t *respbuf, unsigned int respbuf_sz) 75291239f2cSJit Loon Lim { 753fffcb25cSJit Loon Lim if (mailbox_seu_err_status(respbuf, respbuf_sz) < 0) { 754fffcb25cSJit Loon Lim return INTEL_SIP_SMC_SEU_ERR_READ_ERROR; 755fffcb25cSJit Loon Lim } 756fffcb25cSJit Loon Lim 757fffcb25cSJit Loon Lim return INTEL_SIP_SMC_STATUS_OK; 758fffcb25cSJit Loon Lim } 759fffcb25cSJit Loon Lim 760fffcb25cSJit Loon Lim /* SDM SAFE SEU Error inject services */ 761fffcb25cSJit Loon Lim static uint32_t intel_sdm_safe_inject_seu_err(uint32_t *command, uint32_t len) 762fffcb25cSJit Loon Lim { 763fffcb25cSJit Loon Lim if (mailbox_safe_inject_seu_err(command, len) < 0) { 76491239f2cSJit Loon Lim return INTEL_SIP_SMC_SEU_ERR_READ_ERROR; 76591239f2cSJit Loon Lim } 76691239f2cSJit Loon Lim 76791239f2cSJit Loon Lim return INTEL_SIP_SMC_STATUS_OK; 76891239f2cSJit Loon Lim } 76991239f2cSJit Loon Lim 770b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 771b727664eSSieu Mun Tang /* SMMU HPS Remapper */ 772b727664eSSieu Mun Tang void intel_smmu_hps_remapper_init(uint64_t *mem) 773b727664eSSieu Mun Tang { 774b727664eSSieu Mun Tang /* Read out Bit 1 value */ 775b727664eSSieu Mun Tang uint32_t remap = (mmio_read_32(SOCFPGA_SYSMGR(BOOT_SCRATCH_POR_1)) & 0x02); 776b727664eSSieu Mun Tang 777ea906b9bSSieu Mun Tang if ((remap == 0x00) && (g_remapper_bypass == 0x00)) { 778b727664eSSieu Mun Tang /* Update DRAM Base address for SDM SMMU */ 779b727664eSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_ARADDR_REMAP), DRAM_BASE); 780b727664eSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_AWADDR_REMAP), DRAM_BASE); 781b727664eSSieu Mun Tang *mem = *mem - DRAM_BASE; 782b727664eSSieu Mun Tang } else { 783b727664eSSieu Mun Tang *mem = *mem - DRAM_BASE; 784b727664eSSieu Mun Tang } 785b727664eSSieu Mun Tang } 786ea906b9bSSieu Mun Tang 787ea906b9bSSieu Mun Tang int intel_smmu_hps_remapper_config(uint32_t remapper_bypass) 788ea906b9bSSieu Mun Tang { 789ea906b9bSSieu Mun Tang /* Read out the JTAG-ID from boot scratch register */ 790ea906b9bSSieu Mun Tang if (is_agilex5_A5F0() != 0) { 791ea906b9bSSieu Mun Tang if (remapper_bypass == 0x01) { 792ea906b9bSSieu Mun Tang g_remapper_bypass = remapper_bypass; 793ea906b9bSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_ARADDR_REMAP), 0); 794ea906b9bSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_AWADDR_REMAP), 0); 795ea906b9bSSieu Mun Tang } 796ea906b9bSSieu Mun Tang } 797ea906b9bSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 798ea906b9bSSieu Mun Tang } 799b727664eSSieu Mun Tang #endif 800b727664eSSieu Mun Tang 801c76d4239SHadi Asyrafi /* 802c76d4239SHadi Asyrafi * This function is responsible for handling all SiP calls from the NS world 803c76d4239SHadi Asyrafi */ 804c76d4239SHadi Asyrafi 805ad47f142SSieu Mun Tang uintptr_t sip_smc_handler_v1(uint32_t smc_fid, 806c76d4239SHadi Asyrafi u_register_t x1, 807c76d4239SHadi Asyrafi u_register_t x2, 808c76d4239SHadi Asyrafi u_register_t x3, 809c76d4239SHadi Asyrafi u_register_t x4, 810c76d4239SHadi Asyrafi void *cookie, 811c76d4239SHadi Asyrafi void *handle, 812c76d4239SHadi Asyrafi u_register_t flags) 813c76d4239SHadi Asyrafi { 814d1740831SSieu Mun Tang uint32_t retval = 0, completed_addr[3]; 815d1740831SSieu Mun Tang uint32_t retval2 = 0; 81677902fcaSSieu Mun Tang uint32_t mbox_error = 0; 817fffcb25cSJit Loon Lim uint64_t retval64, rsu_respbuf[9]; 818fffcb25cSJit Loon Lim uint32_t seu_respbuf[3]; 819286b96f4SSieu Mun Tang int status = INTEL_SIP_SMC_STATUS_OK; 820a250c04bSSieu Mun Tang int mbox_status; 821a250c04bSSieu Mun Tang unsigned int len_in_resp; 822c05ea296SSieu Mun Tang u_register_t x5, x6, x7; 823f8e6a09cSAbdul Halim, Muhammad Hadi Asyrafi 824c76d4239SHadi Asyrafi switch (smc_fid) { 825c76d4239SHadi Asyrafi case SIP_SVC_UID: 826c76d4239SHadi Asyrafi /* Return UID to the caller */ 827c76d4239SHadi Asyrafi SMC_UUID_RET(handle, intl_svc_uid); 82813d33d52SHadi Asyrafi 829c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_ISDONE: 830673afd6fSSieu Mun Tang status = intel_mailbox_fpga_config_isdone(); 831c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 83213d33d52SHadi Asyrafi 833c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM: 834c76d4239SHadi Asyrafi SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 835c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR, 836c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_SIZE - 837c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR); 83813d33d52SHadi Asyrafi 839c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_START: 840c76d4239SHadi Asyrafi status = intel_fpga_config_start(x1); 841c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 84213d33d52SHadi Asyrafi 843c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_WRITE: 844c76d4239SHadi Asyrafi status = intel_fpga_config_write(x1, x2); 845c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 84613d33d52SHadi Asyrafi 847c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE: 848c76d4239SHadi Asyrafi status = intel_fpga_config_completed_write(completed_addr, 849aad868b4SAbdul Halim, Muhammad Hadi Asyrafi &retval, &rcv_id); 850aad868b4SAbdul Halim, Muhammad Hadi Asyrafi switch (retval) { 851c76d4239SHadi Asyrafi case 1: 852c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 853c76d4239SHadi Asyrafi completed_addr[0], 0, 0); 85413d33d52SHadi Asyrafi 855c76d4239SHadi Asyrafi case 2: 856c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 857c76d4239SHadi Asyrafi completed_addr[0], 858c76d4239SHadi Asyrafi completed_addr[1], 0); 85913d33d52SHadi Asyrafi 860c76d4239SHadi Asyrafi case 3: 861c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 862c76d4239SHadi Asyrafi completed_addr[0], 863c76d4239SHadi Asyrafi completed_addr[1], 864c76d4239SHadi Asyrafi completed_addr[2]); 86513d33d52SHadi Asyrafi 866c76d4239SHadi Asyrafi case 0: 867c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 86813d33d52SHadi Asyrafi 869c76d4239SHadi Asyrafi default: 870cefb37ebSTien Hock, Loh mailbox_clear_response(); 871c76d4239SHadi Asyrafi SMC_RET1(handle, INTEL_SIP_SMC_STATUS_ERROR); 872c76d4239SHadi Asyrafi } 87313d33d52SHadi Asyrafi 87413d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_READ: 875aad868b4SAbdul Halim, Muhammad Hadi Asyrafi status = intel_secure_reg_read(x1, &retval); 876aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 87713d33d52SHadi Asyrafi 87813d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_WRITE: 879aad868b4SAbdul Halim, Muhammad Hadi Asyrafi status = intel_secure_reg_write(x1, (uint32_t)x2, &retval); 880aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 88113d33d52SHadi Asyrafi 88213d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_UPDATE: 88313d33d52SHadi Asyrafi status = intel_secure_reg_update(x1, (uint32_t)x2, 884aad868b4SAbdul Halim, Muhammad Hadi Asyrafi (uint32_t)x3, &retval); 885aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 886c76d4239SHadi Asyrafi 887e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_STATUS: 888e1f97d9cSHadi Asyrafi status = intel_rsu_status(rsu_respbuf, 889e1f97d9cSHadi Asyrafi ARRAY_SIZE(rsu_respbuf)); 890e1f97d9cSHadi Asyrafi if (status) { 891e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 892e1f97d9cSHadi Asyrafi } else { 893e1f97d9cSHadi Asyrafi SMC_RET4(handle, rsu_respbuf[0], rsu_respbuf[1], 894e1f97d9cSHadi Asyrafi rsu_respbuf[2], rsu_respbuf[3]); 895e1f97d9cSHadi Asyrafi } 896e1f97d9cSHadi Asyrafi 897e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_UPDATE: 898e1f97d9cSHadi Asyrafi status = intel_rsu_update(x1); 899e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 900e1f97d9cSHadi Asyrafi 901e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_NOTIFY: 902e1f97d9cSHadi Asyrafi status = intel_rsu_notify(x1); 903e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 904e1f97d9cSHadi Asyrafi 905e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_RETRY_COUNTER: 906e1f97d9cSHadi Asyrafi status = intel_rsu_retry_counter((uint32_t *)rsu_respbuf, 907aad868b4SAbdul Halim, Muhammad Hadi Asyrafi ARRAY_SIZE(rsu_respbuf), &retval); 908e1f97d9cSHadi Asyrafi if (status) { 909e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 910e1f97d9cSHadi Asyrafi } else { 911aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET2(handle, status, retval); 912e1f97d9cSHadi Asyrafi } 913e1f97d9cSHadi Asyrafi 91444eb782eSChee Hong Ang case INTEL_SIP_SMC_RSU_DCMF_VERSION: 91544eb782eSChee Hong Ang SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 91644eb782eSChee Hong Ang ((uint64_t)rsu_dcmf_ver[1] << 32) | rsu_dcmf_ver[0], 91744eb782eSChee Hong Ang ((uint64_t)rsu_dcmf_ver[3] << 32) | rsu_dcmf_ver[2]); 91844eb782eSChee Hong Ang 91944eb782eSChee Hong Ang case INTEL_SIP_SMC_RSU_COPY_DCMF_VERSION: 92044eb782eSChee Hong Ang status = intel_rsu_copy_dcmf_version(x1, x2); 92144eb782eSChee Hong Ang SMC_RET1(handle, status); 92244eb782eSChee Hong Ang 9238fb1b484SKah Jing Lee case INTEL_SIP_SMC_RSU_GET_DEVICE_INFO: 9248fb1b484SKah Jing Lee status = intel_rsu_get_device_info((uint32_t *)rsu_respbuf, 9258fb1b484SKah Jing Lee ARRAY_SIZE(rsu_respbuf)); 9268fb1b484SKah Jing Lee if (status) { 9278fb1b484SKah Jing Lee SMC_RET1(handle, status); 9288fb1b484SKah Jing Lee } else { 9298fb1b484SKah Jing Lee SMC_RET5(handle, status, rsu_respbuf[0], rsu_respbuf[1], 9308fb1b484SKah Jing Lee rsu_respbuf[2], rsu_respbuf[3]); 9318fb1b484SKah Jing Lee } 9328fb1b484SKah Jing Lee 933984e236eSSieu Mun Tang case INTEL_SIP_SMC_RSU_DCMF_STATUS: 934984e236eSSieu Mun Tang SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, 935984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[3] << 48) | 936984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[2] << 32) | 937984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[1] << 16) | 938984e236eSSieu Mun Tang rsu_dcmf_stat[0]); 939984e236eSSieu Mun Tang 940984e236eSSieu Mun Tang case INTEL_SIP_SMC_RSU_COPY_DCMF_STATUS: 941984e236eSSieu Mun Tang status = intel_rsu_copy_dcmf_status(x1); 942984e236eSSieu Mun Tang SMC_RET1(handle, status); 943984e236eSSieu Mun Tang 9444c26957bSChee Hong Ang case INTEL_SIP_SMC_RSU_MAX_RETRY: 9454c26957bSChee Hong Ang SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, rsu_max_retry); 9464c26957bSChee Hong Ang 9474c26957bSChee Hong Ang case INTEL_SIP_SMC_RSU_COPY_MAX_RETRY: 9484c26957bSChee Hong Ang rsu_max_retry = x1; 9494c26957bSChee Hong Ang SMC_RET1(handle, INTEL_SIP_SMC_STATUS_OK); 9504c26957bSChee Hong Ang 951c703d752SSieu Mun Tang case INTEL_SIP_SMC_ECC_DBE: 952c703d752SSieu Mun Tang status = intel_ecc_dbe_notification(x1); 953c703d752SSieu Mun Tang SMC_RET1(handle, status); 954c703d752SSieu Mun Tang 955b703facaSSieu Mun Tang case INTEL_SIP_SMC_SERVICE_COMPLETED: 956b703facaSSieu Mun Tang status = intel_smc_service_completed(x1, x2, x3, &rcv_id, 957b703facaSSieu Mun Tang &len_in_resp, &mbox_error); 958b703facaSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, len_in_resp); 959b703facaSSieu Mun Tang 960c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi case INTEL_SIP_SMC_FIRMWARE_VERSION: 961c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi status = intel_smc_fw_version(&retval); 962c026dfe3SSieu Mun Tang SMC_RET2(handle, status, retval); 963c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 9640c5d62adSHadi Asyrafi case INTEL_SIP_SMC_MBOX_SEND_CMD: 9650c5d62adSHadi Asyrafi x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 9660c5d62adSHadi Asyrafi x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 967ac097fdfSSieu Mun Tang status = intel_mbox_send_cmd(x1, (uint32_t *)x2, x3, x4, x5, x6, 968ac097fdfSSieu Mun Tang &mbox_status, &len_in_resp); 969108514ffSSieu Mun Tang SMC_RET3(handle, status, mbox_status, len_in_resp); 9700c5d62adSHadi Asyrafi 97193a5b97eSSieu Mun Tang case INTEL_SIP_SMC_GET_USERCODE: 97293a5b97eSSieu Mun Tang status = intel_smc_get_usercode(&retval); 97393a5b97eSSieu Mun Tang SMC_RET2(handle, status, retval); 97493a5b97eSSieu Mun Tang 97502d3ef33SSieu Mun Tang case INTEL_SIP_SMC_FCS_CRYPTION: 97602d3ef33SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 97702d3ef33SSieu Mun Tang 97802d3ef33SSieu Mun Tang if (x1 == FCS_MODE_DECRYPT) { 97902d3ef33SSieu Mun Tang status = intel_fcs_decryption(x2, x3, x4, x5, &send_id); 98002d3ef33SSieu Mun Tang } else if (x1 == FCS_MODE_ENCRYPT) { 98102d3ef33SSieu Mun Tang status = intel_fcs_encryption(x2, x3, x4, x5, &send_id); 98202d3ef33SSieu Mun Tang } else { 98302d3ef33SSieu Mun Tang status = INTEL_SIP_SMC_STATUS_REJECTED; 98402d3ef33SSieu Mun Tang } 98502d3ef33SSieu Mun Tang 98602d3ef33SSieu Mun Tang SMC_RET3(handle, status, x4, x5); 98702d3ef33SSieu Mun Tang 988537ff052SSieu Mun Tang case INTEL_SIP_SMC_FCS_CRYPTION_EXT: 989537ff052SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 990537ff052SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 991537ff052SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 992537ff052SSieu Mun Tang 993537ff052SSieu Mun Tang if (x3 == FCS_MODE_DECRYPT) { 994537ff052SSieu Mun Tang status = intel_fcs_decryption_ext(x1, x2, x4, x5, x6, 995537ff052SSieu Mun Tang (uint32_t *) &x7, &mbox_error); 996537ff052SSieu Mun Tang } else if (x3 == FCS_MODE_ENCRYPT) { 997537ff052SSieu Mun Tang status = intel_fcs_encryption_ext(x1, x2, x4, x5, x6, 998537ff052SSieu Mun Tang (uint32_t *) &x7, &mbox_error); 999537ff052SSieu Mun Tang } else { 1000537ff052SSieu Mun Tang status = INTEL_SIP_SMC_STATUS_REJECTED; 1001537ff052SSieu Mun Tang } 1002537ff052SSieu Mun Tang 1003537ff052SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x6, x7); 1004537ff052SSieu Mun Tang 10054837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_RANDOM_NUMBER: 10064837a640SSieu Mun Tang status = intel_fcs_random_number_gen(x1, &retval64, 10074837a640SSieu Mun Tang &mbox_error); 10084837a640SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, retval64); 10094837a640SSieu Mun Tang 101024f9dc8aSSieu Mun Tang case INTEL_SIP_SMC_FCS_RANDOM_NUMBER_EXT: 101124f9dc8aSSieu Mun Tang status = intel_fcs_random_number_gen_ext(x1, x2, x3, 101224f9dc8aSSieu Mun Tang &send_id); 101324f9dc8aSSieu Mun Tang SMC_RET1(handle, status); 101424f9dc8aSSieu Mun Tang 10154837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_SEND_CERTIFICATE: 10164837a640SSieu Mun Tang status = intel_fcs_send_cert(x1, x2, &send_id); 10174837a640SSieu Mun Tang SMC_RET1(handle, status); 10184837a640SSieu Mun Tang 10194837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_PROVISION_DATA: 10204837a640SSieu Mun Tang status = intel_fcs_get_provision_data(&send_id); 10214837a640SSieu Mun Tang SMC_RET1(handle, status); 10224837a640SSieu Mun Tang 10237facacecSSieu Mun Tang case INTEL_SIP_SMC_FCS_CNTR_SET_PREAUTH: 10247facacecSSieu Mun Tang status = intel_fcs_cntr_set_preauth(x1, x2, x3, 10257facacecSSieu Mun Tang &mbox_error); 10267facacecSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10277facacecSSieu Mun Tang 102811f4f030SSieu Mun Tang case INTEL_SIP_SMC_HPS_SET_BRIDGES: 102911f4f030SSieu Mun Tang status = intel_hps_set_bridges(x1, x2); 103011f4f030SSieu Mun Tang SMC_RET1(handle, status); 103111f4f030SSieu Mun Tang 1032ad47f142SSieu Mun Tang case INTEL_SIP_SMC_HWMON_READTEMP: 1033ad47f142SSieu Mun Tang status = intel_hwmon_readtemp(x1, &retval); 1034ad47f142SSieu Mun Tang SMC_RET2(handle, status, retval); 1035ad47f142SSieu Mun Tang 1036ad47f142SSieu Mun Tang case INTEL_SIP_SMC_HWMON_READVOLT: 1037ad47f142SSieu Mun Tang status = intel_hwmon_readvolt(x1, &retval); 1038ad47f142SSieu Mun Tang SMC_RET2(handle, status, retval); 1039ad47f142SSieu Mun Tang 1040d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_PSGSIGMA_TEARDOWN: 1041d1740831SSieu Mun Tang status = intel_fcs_sigma_teardown(x1, &mbox_error); 1042d1740831SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1043d1740831SSieu Mun Tang 1044d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_CHIP_ID: 1045d1740831SSieu Mun Tang status = intel_fcs_chip_id(&retval, &retval2, &mbox_error); 1046d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, retval, retval2); 1047d1740831SSieu Mun Tang 1048d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_ATTESTATION_SUBKEY: 1049d1740831SSieu Mun Tang status = intel_fcs_attestation_subkey(x1, x2, x3, 1050d1740831SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1051d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1052d1740831SSieu Mun Tang 1053d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_ATTESTATION_MEASUREMENTS: 1054d1740831SSieu Mun Tang status = intel_fcs_get_measurement(x1, x2, x3, 1055d1740831SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1056d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1057d1740831SSieu Mun Tang 1058581182c1SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_ATTESTATION_CERT: 1059581182c1SSieu Mun Tang status = intel_fcs_get_attestation_cert(x1, x2, 1060581182c1SSieu Mun Tang (uint32_t *) &x3, &mbox_error); 1061581182c1SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x2, x3); 1062581182c1SSieu Mun Tang 1063581182c1SSieu Mun Tang case INTEL_SIP_SMC_FCS_CREATE_CERT_ON_RELOAD: 1064581182c1SSieu Mun Tang status = intel_fcs_create_cert_on_reload(x1, &mbox_error); 1065581182c1SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1066581182c1SSieu Mun Tang 10676dc00c24SSieu Mun Tang case INTEL_SIP_SMC_FCS_OPEN_CS_SESSION: 10686dc00c24SSieu Mun Tang status = intel_fcs_open_crypto_service_session(&retval, &mbox_error); 10696dc00c24SSieu Mun Tang SMC_RET3(handle, status, mbox_error, retval); 10706dc00c24SSieu Mun Tang 10716dc00c24SSieu Mun Tang case INTEL_SIP_SMC_FCS_CLOSE_CS_SESSION: 10726dc00c24SSieu Mun Tang status = intel_fcs_close_crypto_service_session(x1, &mbox_error); 10736dc00c24SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10746dc00c24SSieu Mun Tang 1075342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_IMPORT_CS_KEY: 1076342a0618SSieu Mun Tang status = intel_fcs_import_crypto_service_key(x1, x2, &send_id); 1077342a0618SSieu Mun Tang SMC_RET1(handle, status); 1078342a0618SSieu Mun Tang 1079342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_EXPORT_CS_KEY: 1080342a0618SSieu Mun Tang status = intel_fcs_export_crypto_service_key(x1, x2, x3, 1081342a0618SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1082342a0618SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1083342a0618SSieu Mun Tang 1084342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_REMOVE_CS_KEY: 1085342a0618SSieu Mun Tang status = intel_fcs_remove_crypto_service_key(x1, x2, 1086342a0618SSieu Mun Tang &mbox_error); 1087342a0618SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1088342a0618SSieu Mun Tang 1089342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_CS_KEY_INFO: 1090342a0618SSieu Mun Tang status = intel_fcs_get_crypto_service_key_info(x1, x2, x3, 1091342a0618SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1092342a0618SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1093342a0618SSieu Mun Tang 10947e8249a2SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_INIT: 10957e8249a2SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10967e8249a2SSieu Mun Tang status = intel_fcs_get_digest_init(x1, x2, x3, 10977e8249a2SSieu Mun Tang x4, x5, &mbox_error); 10987e8249a2SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10997e8249a2SSieu Mun Tang 110070a7e6afSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_UPDATE: 110170a7e6afSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 110270a7e6afSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 110370a7e6afSSieu Mun Tang status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 110470a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, false, 110570a7e6afSSieu Mun Tang &mbox_error); 110670a7e6afSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 110770a7e6afSSieu Mun Tang 11087e8249a2SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_FINALIZE: 11097e8249a2SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11107e8249a2SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 111170a7e6afSSieu Mun Tang status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 111270a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, true, 111370a7e6afSSieu Mun Tang &mbox_error); 11147e8249a2SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11157e8249a2SSieu Mun Tang 11164687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_UPDATE: 11174687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11184687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11194687021dSSieu Mun Tang status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 11204687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, false, 11214687021dSSieu Mun Tang &mbox_error, &send_id); 11224687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11234687021dSSieu Mun Tang 11244687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_FINALIZE: 11254687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11264687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11274687021dSSieu Mun Tang status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 11284687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, true, 11294687021dSSieu Mun Tang &mbox_error, &send_id); 11304687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11314687021dSSieu Mun Tang 1132c05ea296SSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_INIT: 1133c05ea296SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1134c05ea296SSieu Mun Tang status = intel_fcs_mac_verify_init(x1, x2, x3, 1135c05ea296SSieu Mun Tang x4, x5, &mbox_error); 1136c05ea296SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1137c05ea296SSieu Mun Tang 113870a7e6afSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_UPDATE: 113970a7e6afSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 114070a7e6afSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 114170a7e6afSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 114270a7e6afSSieu Mun Tang status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 114370a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 114470a7e6afSSieu Mun Tang false, &mbox_error); 114570a7e6afSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 114670a7e6afSSieu Mun Tang 1147c05ea296SSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_FINALIZE: 1148c05ea296SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1149c05ea296SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1150c05ea296SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 115170a7e6afSSieu Mun Tang status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 115270a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 115370a7e6afSSieu Mun Tang true, &mbox_error); 1154c05ea296SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 1155c05ea296SSieu Mun Tang 11564687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_UPDATE: 11574687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11584687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11594687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 11604687021dSSieu Mun Tang status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 11614687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 11624687021dSSieu Mun Tang false, &mbox_error, &send_id); 11634687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11644687021dSSieu Mun Tang 11654687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_FINALIZE: 11664687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11674687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11684687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 11694687021dSSieu Mun Tang status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 11704687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 11714687021dSSieu Mun Tang true, &mbox_error, &send_id); 11724687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11734687021dSSieu Mun Tang 117407912da1SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_INIT: 117507912da1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 117607912da1SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_init(x1, x2, x3, 117707912da1SSieu Mun Tang x4, x5, &mbox_error); 117807912da1SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 117907912da1SSieu Mun Tang 11801d97dd74SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_UPDATE: 11811d97dd74SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11821d97dd74SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11831d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 11841d97dd74SSieu Mun Tang x3, x4, x5, (uint32_t *) &x6, false, 11851d97dd74SSieu Mun Tang &mbox_error); 11861d97dd74SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11871d97dd74SSieu Mun Tang 118807912da1SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_FINALIZE: 118907912da1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 119007912da1SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11911d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 11921d97dd74SSieu Mun Tang x3, x4, x5, (uint32_t *) &x6, true, 11931d97dd74SSieu Mun Tang &mbox_error); 119407912da1SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 119507912da1SSieu Mun Tang 11964687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_UPDATE: 11974687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11984687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11994687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 12004687021dSSieu Mun Tang x2, x3, x4, x5, (uint32_t *) &x6, false, 12014687021dSSieu Mun Tang &mbox_error, &send_id); 12024687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12034687021dSSieu Mun Tang 12044687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_FINALIZE: 12054687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12064687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12074687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 12084687021dSSieu Mun Tang x2, x3, x4, x5, (uint32_t *) &x6, true, 12094687021dSSieu Mun Tang &mbox_error, &send_id); 12104687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12114687021dSSieu Mun Tang 121269254105SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_INIT: 121369254105SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 121469254105SSieu Mun Tang status = intel_fcs_ecdsa_hash_sign_init(x1, x2, x3, 121569254105SSieu Mun Tang x4, x5, &mbox_error); 121669254105SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 121769254105SSieu Mun Tang 121869254105SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_FINALIZE: 121969254105SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 122069254105SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 122169254105SSieu Mun Tang status = intel_fcs_ecdsa_hash_sign_finalize(x1, x2, x3, 122269254105SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 122369254105SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 122469254105SSieu Mun Tang 12257e25eb87SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_INIT: 12267e25eb87SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12277e25eb87SSieu Mun Tang status = intel_fcs_ecdsa_hash_sig_verify_init(x1, x2, x3, 12287e25eb87SSieu Mun Tang x4, x5, &mbox_error); 12297e25eb87SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 12307e25eb87SSieu Mun Tang 12317e25eb87SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_FINALIZE: 12327e25eb87SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12337e25eb87SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12347e25eb87SSieu Mun Tang status = intel_fcs_ecdsa_hash_sig_verify_finalize(x1, x2, x3, 12357e25eb87SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 12367e25eb87SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12377e25eb87SSieu Mun Tang 123858305060SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_INIT: 123958305060SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 124058305060SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_init(x1, x2, x3, 124158305060SSieu Mun Tang x4, x5, &mbox_error); 124258305060SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 124358305060SSieu Mun Tang 12441d97dd74SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_UPDATE: 12451d97dd74SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12461d97dd74SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12471d97dd74SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12481d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 12491d97dd74SSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12501d97dd74SSieu Mun Tang x7, false, &mbox_error); 12511d97dd74SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12521d97dd74SSieu Mun Tang 12534687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_UPDATE: 12544687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12554687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12564687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12574687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 12584687021dSSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12594687021dSSieu Mun Tang x7, false, &mbox_error, &send_id); 12604687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12614687021dSSieu Mun Tang 12624687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_FINALIZE: 12634687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12644687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12654687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12664687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 12674687021dSSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12684687021dSSieu Mun Tang x7, true, &mbox_error, &send_id); 12694687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12704687021dSSieu Mun Tang 127158305060SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_FINALIZE: 127258305060SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 127358305060SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 127458305060SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12751d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 12761d97dd74SSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12771d97dd74SSieu Mun Tang x7, true, &mbox_error); 127858305060SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 127907912da1SSieu Mun Tang 1280d2fee94aSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_INIT: 1281d2fee94aSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1282d2fee94aSSieu Mun Tang status = intel_fcs_ecdsa_get_pubkey_init(x1, x2, x3, 1283d2fee94aSSieu Mun Tang x4, x5, &mbox_error); 1284d2fee94aSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1285d2fee94aSSieu Mun Tang 1286d2fee94aSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_FINALIZE: 1287d2fee94aSSieu Mun Tang status = intel_fcs_ecdsa_get_pubkey_finalize(x1, x2, x3, 1288d2fee94aSSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1289d2fee94aSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1290d2fee94aSSieu Mun Tang 129149446866SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDH_REQUEST_INIT: 129249446866SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 129349446866SSieu Mun Tang status = intel_fcs_ecdh_request_init(x1, x2, x3, 129449446866SSieu Mun Tang x4, x5, &mbox_error); 129549446866SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 129649446866SSieu Mun Tang 129749446866SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDH_REQUEST_FINALIZE: 129849446866SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 129949446866SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 130049446866SSieu Mun Tang status = intel_fcs_ecdh_request_finalize(x1, x2, x3, 130149446866SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 130249446866SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 130349446866SSieu Mun Tang 13046726390eSSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_INIT: 13056726390eSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 13066726390eSSieu Mun Tang status = intel_fcs_aes_crypt_init(x1, x2, x3, x4, x5, 13076726390eSSieu Mun Tang &mbox_error); 13086726390eSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 13096726390eSSieu Mun Tang 1310dcb144f1SSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_UPDATE: 1311dcb144f1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1312dcb144f1SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1313dcb144f1SSieu Mun Tang status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1314dcb144f1SSieu Mun Tang x5, x6, false, &send_id); 1315dcb144f1SSieu Mun Tang SMC_RET1(handle, status); 1316dcb144f1SSieu Mun Tang 13176726390eSSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_FINALIZE: 13186726390eSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 13196726390eSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1320dcb144f1SSieu Mun Tang status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1321dcb144f1SSieu Mun Tang x5, x6, true, &send_id); 13226726390eSSieu Mun Tang SMC_RET1(handle, status); 13236726390eSSieu Mun Tang 1324ea906b9bSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 1325ea906b9bSSieu Mun Tang case INTEL_SIP_SMC_FCS_SDM_REMAPPER_CONFIG: 1326ea906b9bSSieu Mun Tang status = intel_smmu_hps_remapper_config(x1); 1327ea906b9bSSieu Mun Tang SMC_RET1(handle, status); 1328ea906b9bSSieu Mun Tang #endif 1329ea906b9bSSieu Mun Tang 133077902fcaSSieu Mun Tang case INTEL_SIP_SMC_GET_ROM_PATCH_SHA384: 133177902fcaSSieu Mun Tang status = intel_fcs_get_rom_patch_sha384(x1, &retval64, 133277902fcaSSieu Mun Tang &mbox_error); 133377902fcaSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, retval64); 133477902fcaSSieu Mun Tang 1335f0c40b89SSieu Mun Tang case INTEL_SIP_SMC_SVC_VERSION: 1336f0c40b89SSieu Mun Tang SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 1337f0c40b89SSieu Mun Tang SIP_SVC_VERSION_MAJOR, 1338f0c40b89SSieu Mun Tang SIP_SVC_VERSION_MINOR); 1339f0c40b89SSieu Mun Tang 134091239f2cSJit Loon Lim case INTEL_SIP_SMC_SEU_ERR_STATUS: 134191239f2cSJit Loon Lim status = intel_sdm_seu_err_read(seu_respbuf, 134291239f2cSJit Loon Lim ARRAY_SIZE(seu_respbuf)); 134391239f2cSJit Loon Lim if (status) { 134491239f2cSJit Loon Lim SMC_RET1(handle, status); 134591239f2cSJit Loon Lim } else { 134691239f2cSJit Loon Lim SMC_RET3(handle, seu_respbuf[0], seu_respbuf[1], seu_respbuf[2]); 134791239f2cSJit Loon Lim } 134891239f2cSJit Loon Lim 1349fffcb25cSJit Loon Lim case INTEL_SIP_SMC_SAFE_INJECT_SEU_ERR: 1350fffcb25cSJit Loon Lim status = intel_sdm_safe_inject_seu_err((uint32_t *)&x1, (uint32_t)x2); 1351fffcb25cSJit Loon Lim SMC_RET1(handle, status); 1352fffcb25cSJit Loon Lim 1353c76d4239SHadi Asyrafi default: 1354c76d4239SHadi Asyrafi return socfpga_sip_handler(smc_fid, x1, x2, x3, x4, 1355c76d4239SHadi Asyrafi cookie, handle, flags); 1356c76d4239SHadi Asyrafi } 1357c76d4239SHadi Asyrafi } 1358c76d4239SHadi Asyrafi 1359ad47f142SSieu Mun Tang uintptr_t sip_smc_handler(uint32_t smc_fid, 1360ad47f142SSieu Mun Tang u_register_t x1, 1361ad47f142SSieu Mun Tang u_register_t x2, 1362ad47f142SSieu Mun Tang u_register_t x3, 1363ad47f142SSieu Mun Tang u_register_t x4, 1364ad47f142SSieu Mun Tang void *cookie, 1365ad47f142SSieu Mun Tang void *handle, 1366ad47f142SSieu Mun Tang u_register_t flags) 1367ad47f142SSieu Mun Tang { 1368ad47f142SSieu Mun Tang uint32_t cmd = smc_fid & INTEL_SIP_SMC_CMD_MASK; 1369ad47f142SSieu Mun Tang 1370ad47f142SSieu Mun Tang if (cmd >= INTEL_SIP_SMC_CMD_V2_RANGE_BEGIN && 1371ad47f142SSieu Mun Tang cmd <= INTEL_SIP_SMC_CMD_V2_RANGE_END) { 1372ad47f142SSieu Mun Tang return sip_smc_handler_v2(smc_fid, x1, x2, x3, x4, 1373ad47f142SSieu Mun Tang cookie, handle, flags); 1374ad47f142SSieu Mun Tang } else { 1375ad47f142SSieu Mun Tang return sip_smc_handler_v1(smc_fid, x1, x2, x3, x4, 1376ad47f142SSieu Mun Tang cookie, handle, flags); 1377ad47f142SSieu Mun Tang } 1378ad47f142SSieu Mun Tang } 1379ad47f142SSieu Mun Tang 1380c76d4239SHadi Asyrafi DECLARE_RT_SVC( 1381c76d4239SHadi Asyrafi socfpga_sip_svc, 1382c76d4239SHadi Asyrafi OEN_SIP_START, 1383c76d4239SHadi Asyrafi OEN_SIP_END, 1384c76d4239SHadi Asyrafi SMC_TYPE_FAST, 1385c76d4239SHadi Asyrafi NULL, 1386c76d4239SHadi Asyrafi sip_smc_handler 1387c76d4239SHadi Asyrafi ); 1388c76d4239SHadi Asyrafi 1389c76d4239SHadi Asyrafi DECLARE_RT_SVC( 1390c76d4239SHadi Asyrafi socfpga_sip_svc_std, 1391c76d4239SHadi Asyrafi OEN_SIP_START, 1392c76d4239SHadi Asyrafi OEN_SIP_END, 1393c76d4239SHadi Asyrafi SMC_TYPE_YIELD, 1394c76d4239SHadi Asyrafi NULL, 1395c76d4239SHadi Asyrafi sip_smc_handler 1396c76d4239SHadi Asyrafi ); 1397