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; 31*ea906b9bSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 32*ea906b9bSSieu Mun Tang static uint32_t g_remapper_bypass; 33*ea906b9bSSieu 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 225673afd6fSSieu Mun Tang request_type = RECONFIGURATION; 226673afd6fSSieu Mun Tang 227276a4366SSieu Mun Tang if (!CONFIG_TEST_FLAG(flag, PARTIAL_CONFIG)) { 228276a4366SSieu Mun Tang bridge_disable = true; 229276a4366SSieu Mun Tang } 230276a4366SSieu Mun Tang 231276a4366SSieu Mun Tang if (CONFIG_TEST_FLAG(flag, AUTHENTICATION)) { 232276a4366SSieu Mun Tang size = 1; 233276a4366SSieu Mun Tang bridge_disable = false; 234673afd6fSSieu Mun Tang request_type = BITSTREAM_AUTH; 235ec4f28ecSAbdul Halim, Muhammad Hadi Asyrafi } 2369c8f3af5SHadi Asyrafi 237b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 238b727664eSSieu Mun Tang intel_smmu_hps_remapper_init(0U); 239b727664eSSieu Mun Tang #endif 240b727664eSSieu Mun Tang 241cefb37ebSTien Hock, Loh mailbox_clear_response(); 242cefb37ebSTien Hock, Loh 243a250c04bSSieu Mun Tang mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_CANCEL, NULL, 0U, 244a250c04bSSieu Mun Tang CMD_CASUAL, NULL, NULL); 245cefb37ebSTien Hock, Loh 246a250c04bSSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_RECONFIG, &argument, size, 247a250c04bSSieu Mun Tang CMD_CASUAL, response, &resp_len); 248c76d4239SHadi Asyrafi 249e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi if (status < 0) { 250276a4366SSieu Mun Tang bridge_disable = false; 251673afd6fSSieu Mun Tang request_type = NO_REQUEST; 252e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 253e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi } 254c76d4239SHadi Asyrafi 255c76d4239SHadi Asyrafi max_blocks = response[0]; 256c76d4239SHadi Asyrafi bytes_per_block = response[1]; 257c76d4239SHadi Asyrafi 258c76d4239SHadi Asyrafi for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 259c76d4239SHadi Asyrafi fpga_config_buffers[i].size = 0; 260c76d4239SHadi Asyrafi fpga_config_buffers[i].size_written = 0; 261c76d4239SHadi Asyrafi fpga_config_buffers[i].addr = 0; 262c76d4239SHadi Asyrafi fpga_config_buffers[i].write_requested = 0; 263c76d4239SHadi Asyrafi fpga_config_buffers[i].block_number = 0; 264c76d4239SHadi Asyrafi fpga_config_buffers[i].subblocks_sent = 0; 265c76d4239SHadi Asyrafi } 266c76d4239SHadi Asyrafi 267c76d4239SHadi Asyrafi blocks_submitted = 0; 268c76d4239SHadi Asyrafi current_block = 0; 269cefb37ebSTien Hock, Loh read_block = 0; 270c76d4239SHadi Asyrafi current_buffer = 0; 271c76d4239SHadi Asyrafi 272276a4366SSieu Mun Tang /* Disable bridge on full reconfiguration */ 273276a4366SSieu Mun Tang if (bridge_disable) { 27411f4f030SSieu Mun Tang socfpga_bridges_disable(~0); 2759c8f3af5SHadi Asyrafi } 2769c8f3af5SHadi Asyrafi 277e0fc2d19SAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 278c76d4239SHadi Asyrafi } 279c76d4239SHadi Asyrafi 2807c58fd4eSHadi Asyrafi static bool is_fpga_config_buffer_full(void) 2817c58fd4eSHadi Asyrafi { 282581182c1SSieu Mun Tang for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 283581182c1SSieu Mun Tang if (!fpga_config_buffers[i].write_requested) { 2847c58fd4eSHadi Asyrafi return false; 285581182c1SSieu Mun Tang } 286581182c1SSieu Mun Tang } 2877c58fd4eSHadi Asyrafi return true; 2887c58fd4eSHadi Asyrafi } 2897c58fd4eSHadi Asyrafi 290aad868b4SAbdul Halim, Muhammad Hadi Asyrafi bool is_address_in_ddr_range(uint64_t addr, uint64_t size) 2917c58fd4eSHadi Asyrafi { 292f4aaa9fdSSieu Mun Tang uint128_t dram_max_sz = (uint128_t)DRAM_BASE + (uint128_t)DRAM_SIZE; 293f4aaa9fdSSieu Mun Tang uint128_t dram_region_end = (uint128_t)addr + (uint128_t)size; 294f4aaa9fdSSieu Mun Tang 29512d71ac6SAbdul Halim, Muhammad Hadi Asyrafi if (!addr && !size) { 29612d71ac6SAbdul Halim, Muhammad Hadi Asyrafi return true; 29712d71ac6SAbdul Halim, Muhammad Hadi Asyrafi } 298581182c1SSieu Mun Tang if (size > (UINT64_MAX - addr)) { 2997c58fd4eSHadi Asyrafi return false; 300581182c1SSieu Mun Tang } 301581182c1SSieu Mun Tang if (addr < BL31_LIMIT) { 3021a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return false; 303581182c1SSieu Mun Tang } 304f4aaa9fdSSieu Mun Tang if (dram_region_end > dram_max_sz) { 3051a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return false; 306581182c1SSieu Mun Tang } 3071a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 3081a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return true; 3097c58fd4eSHadi Asyrafi } 310c76d4239SHadi Asyrafi 311e5ebe87bSHadi Asyrafi static uint32_t intel_fpga_config_write(uint64_t mem, uint64_t size) 312c76d4239SHadi Asyrafi { 3137c58fd4eSHadi Asyrafi int i; 314c76d4239SHadi Asyrafi 3157c58fd4eSHadi Asyrafi intel_fpga_sdm_write_all(); 316c76d4239SHadi Asyrafi 3171a87db5dSAbdul Halim, Muhammad Hadi Asyrafi if (!is_address_in_ddr_range(mem, size) || 318ef51b097SAbdul Halim, Muhammad Hadi Asyrafi is_fpga_config_buffer_full()) { 3197c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_REJECTED; 320ef51b097SAbdul Halim, Muhammad Hadi Asyrafi } 321c76d4239SHadi Asyrafi 322b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 323b727664eSSieu Mun Tang intel_smmu_hps_remapper_init(&mem); 324b727664eSSieu Mun Tang #endif 325b727664eSSieu Mun Tang 326c76d4239SHadi Asyrafi for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 3277c58fd4eSHadi Asyrafi int j = (i + current_buffer) % FPGA_CONFIG_BUFFER_SIZE; 3287c58fd4eSHadi Asyrafi 3297c58fd4eSHadi Asyrafi if (!fpga_config_buffers[j].write_requested) { 3307c58fd4eSHadi Asyrafi fpga_config_buffers[j].addr = mem; 3317c58fd4eSHadi Asyrafi fpga_config_buffers[j].size = size; 3327c58fd4eSHadi Asyrafi fpga_config_buffers[j].size_written = 0; 3337c58fd4eSHadi Asyrafi fpga_config_buffers[j].write_requested = 1; 3347c58fd4eSHadi Asyrafi fpga_config_buffers[j].block_number = 335c76d4239SHadi Asyrafi blocks_submitted++; 3367c58fd4eSHadi Asyrafi fpga_config_buffers[j].subblocks_sent = 0; 337c76d4239SHadi Asyrafi break; 338c76d4239SHadi Asyrafi } 339c76d4239SHadi Asyrafi } 340c76d4239SHadi Asyrafi 341ef51b097SAbdul Halim, Muhammad Hadi Asyrafi if (is_fpga_config_buffer_full()) { 3427c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_BUSY; 343ef51b097SAbdul Halim, Muhammad Hadi Asyrafi } 344c76d4239SHadi Asyrafi 3457c58fd4eSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 346c76d4239SHadi Asyrafi } 347c76d4239SHadi Asyrafi 34813d33d52SHadi Asyrafi static int is_out_of_sec_range(uint64_t reg_addr) 34913d33d52SHadi Asyrafi { 3507e954dfcSSiew Chin Lim #if DEBUG 3517e954dfcSSiew Chin Lim return 0; 3527e954dfcSSiew Chin Lim #endif 3537e954dfcSSiew Chin Lim 3548e59b9f4SJit Loon Lim #if PLATFORM_MODEL != PLAT_SOCFPGA_AGILEX5 35513d33d52SHadi Asyrafi switch (reg_addr) { 35613d33d52SHadi Asyrafi case(0xF8011100): /* ECCCTRL1 */ 35713d33d52SHadi Asyrafi case(0xF8011104): /* ECCCTRL2 */ 35813d33d52SHadi Asyrafi case(0xF8011110): /* ERRINTEN */ 35913d33d52SHadi Asyrafi case(0xF8011114): /* ERRINTENS */ 36013d33d52SHadi Asyrafi case(0xF8011118): /* ERRINTENR */ 36113d33d52SHadi Asyrafi case(0xF801111C): /* INTMODE */ 36213d33d52SHadi Asyrafi case(0xF8011120): /* INTSTAT */ 36313d33d52SHadi Asyrafi case(0xF8011124): /* DIAGINTTEST */ 36413d33d52SHadi Asyrafi case(0xF801112C): /* DERRADDRA */ 3654687021dSSieu Mun Tang case(0xFA000000): /* SMMU SCR0 */ 3664687021dSSieu Mun Tang case(0xFA000004): /* SMMU SCR1 */ 3674687021dSSieu Mun Tang case(0xFA000400): /* SMMU NSCR0 */ 3684687021dSSieu Mun Tang case(0xFA004000): /* SMMU SSD0_REG */ 3694687021dSSieu Mun Tang case(0xFA000820): /* SMMU SMR8 */ 3704687021dSSieu Mun Tang case(0xFA000c20): /* SMMU SCR8 */ 3714687021dSSieu Mun Tang case(0xFA028000): /* SMMU CB8_SCTRL */ 3724687021dSSieu Mun Tang case(0xFA001020): /* SMMU CBAR8 */ 3734687021dSSieu Mun Tang case(0xFA028030): /* SMMU TCR_LPAE */ 3744687021dSSieu Mun Tang case(0xFA028020): /* SMMU CB8_TTBR0_LOW */ 3754687021dSSieu Mun Tang case(0xFA028024): /* SMMU CB8_PRRR_HIGH */ 3764687021dSSieu Mun Tang case(0xFA028038): /* SMMU CB8_PRRR_MIR0 */ 3774687021dSSieu Mun Tang case(0xFA02803C): /* SMMU CB8_PRRR_MIR1 */ 3784687021dSSieu Mun Tang case(0xFA028010): /* SMMU_CB8)TCR2 */ 3794687021dSSieu Mun Tang case(0xFFD080A4): /* SDM SMMU STREAM ID REG */ 3804687021dSSieu Mun Tang case(0xFA001820): /* SMMU_CBA2R8 */ 3814687021dSSieu Mun Tang case(0xFA000074): /* SMMU_STLBGSTATUS */ 3824687021dSSieu Mun Tang case(0xFA0287F4): /* SMMU_CB8_TLBSTATUS */ 3834687021dSSieu Mun Tang case(0xFA000060): /* SMMU_STLBIALL */ 3844687021dSSieu Mun Tang case(0xFA000070): /* SMMU_STLBGSYNC */ 3854687021dSSieu Mun Tang case(0xFA028618): /* CB8_TLBALL */ 3864687021dSSieu Mun Tang case(0xFA0287F0): /* CB8_TLBSYNC */ 38713d33d52SHadi Asyrafi case(0xFFD12028): /* SDMMCGRP_CTRL */ 38813d33d52SHadi Asyrafi case(0xFFD12044): /* EMAC0 */ 38913d33d52SHadi Asyrafi case(0xFFD12048): /* EMAC1 */ 39013d33d52SHadi Asyrafi case(0xFFD1204C): /* EMAC2 */ 39113d33d52SHadi Asyrafi case(0xFFD12090): /* ECC_INT_MASK_VALUE */ 39213d33d52SHadi Asyrafi case(0xFFD12094): /* ECC_INT_MASK_SET */ 39313d33d52SHadi Asyrafi case(0xFFD12098): /* ECC_INT_MASK_CLEAR */ 39413d33d52SHadi Asyrafi case(0xFFD1209C): /* ECC_INTSTATUS_SERR */ 39513d33d52SHadi Asyrafi case(0xFFD120A0): /* ECC_INTSTATUS_DERR */ 39613d33d52SHadi Asyrafi case(0xFFD120C0): /* NOC_TIMEOUT */ 39713d33d52SHadi Asyrafi case(0xFFD120C4): /* NOC_IDLEREQ_SET */ 39813d33d52SHadi Asyrafi case(0xFFD120C8): /* NOC_IDLEREQ_CLR */ 39913d33d52SHadi Asyrafi case(0xFFD120D0): /* NOC_IDLEACK */ 40013d33d52SHadi Asyrafi case(0xFFD120D4): /* NOC_IDLESTATUS */ 40113d33d52SHadi Asyrafi case(0xFFD12200): /* BOOT_SCRATCH_COLD0 */ 40213d33d52SHadi Asyrafi case(0xFFD12204): /* BOOT_SCRATCH_COLD1 */ 40313d33d52SHadi Asyrafi case(0xFFD12220): /* BOOT_SCRATCH_COLD8 */ 40413d33d52SHadi Asyrafi case(0xFFD12224): /* BOOT_SCRATCH_COLD9 */ 40513d33d52SHadi Asyrafi return 0; 4068e59b9f4SJit Loon Lim #else 4078e59b9f4SJit Loon Lim switch (reg_addr) { 40813d33d52SHadi Asyrafi 4098e59b9f4SJit Loon Lim case(0xF8011104): /* ECCCTRL2 */ 4108e59b9f4SJit Loon Lim case(0xFFD12028): /* SDMMCGRP_CTRL */ 4118e59b9f4SJit Loon Lim case(0xFFD120C4): /* NOC_IDLEREQ_SET */ 4128e59b9f4SJit Loon Lim case(0xFFD120C8): /* NOC_IDLEREQ_CLR */ 4138e59b9f4SJit Loon Lim case(0xFFD120D0): /* NOC_IDLEACK */ 4148e59b9f4SJit Loon Lim 4158e59b9f4SJit Loon Lim 4168e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ECCCTRL1)): /* ECCCTRL1 */ 4178e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ERRINTEN)): /* ERRINTEN */ 4188e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ERRINTENS)): /* ERRINTENS */ 4198e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(ERRINTENR)): /* ERRINTENR */ 4208e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(INTMODE)): /* INTMODE */ 4218e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(INTSTAT)): /* INTSTAT */ 4228e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(DIAGINTTEST)): /* DIAGINTTEST */ 4238e59b9f4SJit Loon Lim case(SOCFPGA_MEMCTRL(DERRADDRA)): /* DERRADDRA */ 4248e59b9f4SJit Loon Lim 42546839460SJit Loon Lim case(SOCFPGA_ECC_QSPI(INITSTAT)): /* ECC_QSPI_INITSTAT */ 4268e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_0)): /* EMAC0 */ 4278e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_1)): /* EMAC1 */ 4288e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(EMAC_2)): /* EMAC2 */ 4298e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_VALUE)): /* ECC_INT_MASK_VALUE */ 4308e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_SET)): /* ECC_INT_MASK_SET */ 4318e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_CLR)): /* ECC_INT_MASK_CLEAR */ 4328e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_SERR)): /* ECC_INTSTATUS_SERR */ 4338e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(ECC_INTMASK_DERR)): /* ECC_INTSTATUS_DERR */ 4348e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(NOC_TIMEOUT)): /* NOC_TIMEOUT */ 4358e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(NOC_IDLESTATUS)): /* NOC_IDLESTATUS */ 4368e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_0)): /* BOOT_SCRATCH_COLD0 */ 4378e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_1)): /* BOOT_SCRATCH_COLD1 */ 4388e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_8)): /* BOOT_SCRATCH_COLD8 */ 4398e59b9f4SJit Loon Lim case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_9)): /* BOOT_SCRATCH_COLD9 */ 4408e59b9f4SJit Loon Lim #endif 4414d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(CTRL)): /* ECC_QSPI_CTRL */ 4424d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTEN)): /* ECC_QSPI_ERRINTEN */ 4434d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTENS)): /* ECC_QSPI_ERRINTENS */ 4444d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ERRINTENR)): /* ECC_QSPI_ERRINTENR */ 4454d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTMODE)): /* ECC_QSPI_INTMODE */ 4464d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_ACCCTRL)): /* ECC_QSPI_ECC_ACCCTRL */ 4474d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_STARTACC)): /* ECC_QSPI_ECC_STARTACC */ 4484d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(ECC_WDCTRL)): /* ECC_QSPI_ECC_WDCTRL */ 4494d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTSTAT)): /* ECC_QSPI_INTSTAT */ 4504d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTTEST)): /* ECC_QSPI_INTMODE */ 45113d33d52SHadi Asyrafi return 0; 452d6ae69c8SSieu Mun Tang 45313d33d52SHadi Asyrafi default: 45413d33d52SHadi Asyrafi break; 45513d33d52SHadi Asyrafi } 45613d33d52SHadi Asyrafi 45713d33d52SHadi Asyrafi return -1; 45813d33d52SHadi Asyrafi } 45913d33d52SHadi Asyrafi 46013d33d52SHadi Asyrafi /* Secure register access */ 46113d33d52SHadi Asyrafi uint32_t intel_secure_reg_read(uint64_t reg_addr, uint32_t *retval) 46213d33d52SHadi Asyrafi { 46313d33d52SHadi Asyrafi if (is_out_of_sec_range(reg_addr)) { 46413d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 46513d33d52SHadi Asyrafi } 46613d33d52SHadi Asyrafi 46713d33d52SHadi Asyrafi *retval = mmio_read_32(reg_addr); 46813d33d52SHadi Asyrafi 46913d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 47013d33d52SHadi Asyrafi } 47113d33d52SHadi Asyrafi 47213d33d52SHadi Asyrafi uint32_t intel_secure_reg_write(uint64_t reg_addr, uint32_t val, 47313d33d52SHadi Asyrafi uint32_t *retval) 47413d33d52SHadi Asyrafi { 47513d33d52SHadi Asyrafi if (is_out_of_sec_range(reg_addr)) { 47613d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 47713d33d52SHadi Asyrafi } 47813d33d52SHadi Asyrafi 4794d122e5fSJit Loon Lim switch (reg_addr) { 4804d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTSTAT)): /* ECC_QSPI_INTSTAT */ 4814d122e5fSJit Loon Lim case(SOCFPGA_ECC_QSPI(INTTEST)): /* ECC_QSPI_INTMODE */ 4824d122e5fSJit Loon Lim mmio_write_16(reg_addr, val); 4834d122e5fSJit Loon Lim break; 4844d122e5fSJit Loon Lim default: 48513d33d52SHadi Asyrafi mmio_write_32(reg_addr, val); 4864d122e5fSJit Loon Lim break; 4874d122e5fSJit Loon Lim } 48813d33d52SHadi Asyrafi 48913d33d52SHadi Asyrafi return intel_secure_reg_read(reg_addr, retval); 49013d33d52SHadi Asyrafi } 49113d33d52SHadi Asyrafi 49213d33d52SHadi Asyrafi uint32_t intel_secure_reg_update(uint64_t reg_addr, uint32_t mask, 49313d33d52SHadi Asyrafi uint32_t val, uint32_t *retval) 49413d33d52SHadi Asyrafi { 49513d33d52SHadi Asyrafi if (!intel_secure_reg_read(reg_addr, retval)) { 49613d33d52SHadi Asyrafi *retval &= ~mask; 497c9c07099SSiew Chin Lim *retval |= val & mask; 49813d33d52SHadi Asyrafi return intel_secure_reg_write(reg_addr, *retval, retval); 49913d33d52SHadi Asyrafi } 50013d33d52SHadi Asyrafi 50113d33d52SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 50213d33d52SHadi Asyrafi } 50313d33d52SHadi Asyrafi 504e1f97d9cSHadi Asyrafi /* Intel Remote System Update (RSU) services */ 505e1f97d9cSHadi Asyrafi uint64_t intel_rsu_update_address; 506e1f97d9cSHadi Asyrafi 507d57318b7SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_rsu_status(uint64_t *respbuf, unsigned int respbuf_sz) 508e1f97d9cSHadi Asyrafi { 509581182c1SSieu Mun Tang if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 510960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 511581182c1SSieu Mun Tang } 512e1f97d9cSHadi Asyrafi 513e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 514e1f97d9cSHadi Asyrafi } 515e1f97d9cSHadi Asyrafi 5168fb1b484SKah Jing Lee static uint32_t intel_rsu_get_device_info(uint32_t *respbuf, 5178fb1b484SKah Jing Lee unsigned int respbuf_sz) 5188fb1b484SKah Jing Lee { 5198fb1b484SKah Jing Lee if (mailbox_rsu_get_device_info((uint32_t *)respbuf, respbuf_sz) < 0) { 5208fb1b484SKah Jing Lee return INTEL_SIP_SMC_RSU_ERROR; 5218fb1b484SKah Jing Lee } 5228fb1b484SKah Jing Lee 5238fb1b484SKah Jing Lee return INTEL_SIP_SMC_STATUS_OK; 5248fb1b484SKah Jing Lee } 5258fb1b484SKah Jing Lee 526e3c3a48cSMahesh Rao uint32_t intel_rsu_update(uint64_t update_address) 527e1f97d9cSHadi Asyrafi { 528c418064eSJit Loon Lim if (update_address > SIZE_MAX) { 529c418064eSJit Loon Lim return INTEL_SIP_SMC_STATUS_REJECTED; 530c418064eSJit Loon Lim } 531c418064eSJit Loon Lim 532e1f97d9cSHadi Asyrafi intel_rsu_update_address = update_address; 533e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 534e1f97d9cSHadi Asyrafi } 535e1f97d9cSHadi Asyrafi 536ea9b9627SAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_rsu_notify(uint32_t execution_stage) 537e1f97d9cSHadi Asyrafi { 538581182c1SSieu Mun Tang if (mailbox_hps_stage_notify(execution_stage) < 0) { 539960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 540581182c1SSieu Mun Tang } 541e1f97d9cSHadi Asyrafi 542e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 543e1f97d9cSHadi Asyrafi } 544e1f97d9cSHadi Asyrafi 545e1f97d9cSHadi Asyrafi static uint32_t intel_rsu_retry_counter(uint32_t *respbuf, uint32_t respbuf_sz, 546e1f97d9cSHadi Asyrafi uint32_t *ret_stat) 547e1f97d9cSHadi Asyrafi { 548581182c1SSieu Mun Tang if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 549960896ebSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_RSU_ERROR; 550581182c1SSieu Mun Tang } 551e1f97d9cSHadi Asyrafi 552e1f97d9cSHadi Asyrafi *ret_stat = respbuf[8]; 553e1f97d9cSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 554e1f97d9cSHadi Asyrafi } 555e1f97d9cSHadi Asyrafi 55644eb782eSChee Hong Ang static uint32_t intel_rsu_copy_dcmf_version(uint64_t dcmf_ver_1_0, 55744eb782eSChee Hong Ang uint64_t dcmf_ver_3_2) 55844eb782eSChee Hong Ang { 55944eb782eSChee Hong Ang rsu_dcmf_ver[0] = dcmf_ver_1_0; 56044eb782eSChee Hong Ang rsu_dcmf_ver[1] = dcmf_ver_1_0 >> 32; 56144eb782eSChee Hong Ang rsu_dcmf_ver[2] = dcmf_ver_3_2; 56244eb782eSChee Hong Ang rsu_dcmf_ver[3] = dcmf_ver_3_2 >> 32; 56344eb782eSChee Hong Ang 56444eb782eSChee Hong Ang return INTEL_SIP_SMC_STATUS_OK; 56544eb782eSChee Hong Ang } 56644eb782eSChee Hong Ang 567984e236eSSieu Mun Tang static uint32_t intel_rsu_copy_dcmf_status(uint64_t dcmf_stat) 568984e236eSSieu Mun Tang { 569984e236eSSieu Mun Tang rsu_dcmf_stat[0] = 0xFFFF & (dcmf_stat >> (0 * 16)); 570984e236eSSieu Mun Tang rsu_dcmf_stat[1] = 0xFFFF & (dcmf_stat >> (1 * 16)); 571984e236eSSieu Mun Tang rsu_dcmf_stat[2] = 0xFFFF & (dcmf_stat >> (2 * 16)); 572984e236eSSieu Mun Tang rsu_dcmf_stat[3] = 0xFFFF & (dcmf_stat >> (3 * 16)); 573984e236eSSieu Mun Tang 574984e236eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 575984e236eSSieu Mun Tang } 576984e236eSSieu Mun Tang 57752cf9c2cSKris Chaplin /* Intel HWMON services */ 57852cf9c2cSKris Chaplin static uint32_t intel_hwmon_readtemp(uint32_t chan, uint32_t *retval) 57952cf9c2cSKris Chaplin { 58052cf9c2cSKris Chaplin if (mailbox_hwmon_readtemp(chan, retval) < 0) { 58152cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_ERROR; 58252cf9c2cSKris Chaplin } 58352cf9c2cSKris Chaplin 58452cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_OK; 58552cf9c2cSKris Chaplin } 58652cf9c2cSKris Chaplin 58752cf9c2cSKris Chaplin static uint32_t intel_hwmon_readvolt(uint32_t chan, uint32_t *retval) 58852cf9c2cSKris Chaplin { 58952cf9c2cSKris Chaplin if (mailbox_hwmon_readvolt(chan, retval) < 0) { 59052cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_ERROR; 59152cf9c2cSKris Chaplin } 59252cf9c2cSKris Chaplin 59352cf9c2cSKris Chaplin return INTEL_SIP_SMC_STATUS_OK; 59452cf9c2cSKris Chaplin } 59552cf9c2cSKris Chaplin 5960c5d62adSHadi Asyrafi /* Mailbox services */ 597c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi static uint32_t intel_smc_fw_version(uint32_t *fw_version) 598c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi { 599c026dfe3SSieu Mun Tang int status; 600c026dfe3SSieu Mun Tang unsigned int resp_len = CONFIG_STATUS_WORD_SIZE; 601c026dfe3SSieu Mun Tang uint32_t resp_data[CONFIG_STATUS_WORD_SIZE] = {0U}; 602c026dfe3SSieu Mun Tang 603c026dfe3SSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CONFIG_STATUS, NULL, 0U, 604c026dfe3SSieu Mun Tang CMD_CASUAL, resp_data, &resp_len); 605c026dfe3SSieu Mun Tang 606c026dfe3SSieu Mun Tang if (status < 0) { 607c026dfe3SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 608c026dfe3SSieu Mun Tang } 609c026dfe3SSieu Mun Tang 610c026dfe3SSieu Mun Tang if (resp_len <= CONFIG_STATUS_FW_VER_OFFSET) { 611c026dfe3SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 612c026dfe3SSieu Mun Tang } 613c026dfe3SSieu Mun Tang 614c026dfe3SSieu Mun Tang *fw_version = resp_data[CONFIG_STATUS_FW_VER_OFFSET] & CONFIG_STATUS_FW_VER_MASK; 615c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 616c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 617c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi } 618c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 619a250c04bSSieu Mun Tang static uint32_t intel_mbox_send_cmd(uint32_t cmd, uint32_t *args, 620ac097fdfSSieu Mun Tang unsigned int len, uint32_t urgent, uint64_t response, 621a250c04bSSieu Mun Tang unsigned int resp_len, int *mbox_status, 622a250c04bSSieu Mun Tang unsigned int *len_in_resp) 6230c5d62adSHadi Asyrafi { 6241a87db5dSAbdul Halim, Muhammad Hadi Asyrafi *len_in_resp = 0; 625651841f2SSieu Mun Tang *mbox_status = GENERIC_RESPONSE_ERROR; 6261a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 627581182c1SSieu Mun Tang if (!is_address_in_ddr_range((uint64_t)args, sizeof(uint32_t) * len)) { 6281a87db5dSAbdul Halim, Muhammad Hadi Asyrafi return INTEL_SIP_SMC_STATUS_REJECTED; 629581182c1SSieu Mun Tang } 6301a87db5dSAbdul Halim, Muhammad Hadi Asyrafi 6310c5d62adSHadi Asyrafi int status = mailbox_send_cmd(MBOX_JOB_ID, cmd, args, len, urgent, 632ac097fdfSSieu Mun Tang (uint32_t *) response, &resp_len); 6330c5d62adSHadi Asyrafi 6340c5d62adSHadi Asyrafi if (status < 0) { 6350c5d62adSHadi Asyrafi *mbox_status = -status; 6360c5d62adSHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 6370c5d62adSHadi Asyrafi } 6380c5d62adSHadi Asyrafi 6390c5d62adSHadi Asyrafi *mbox_status = 0; 640a250c04bSSieu Mun Tang *len_in_resp = resp_len; 641ac097fdfSSieu Mun Tang 642ac097fdfSSieu Mun Tang flush_dcache_range(response, resp_len * MBOX_WORD_BYTE); 643ac097fdfSSieu Mun Tang 6440c5d62adSHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 6450c5d62adSHadi Asyrafi } 6460c5d62adSHadi Asyrafi 64793a5b97eSSieu Mun Tang static int intel_smc_get_usercode(uint32_t *user_code) 64893a5b97eSSieu Mun Tang { 64993a5b97eSSieu Mun Tang int status; 65093a5b97eSSieu Mun Tang unsigned int resp_len = sizeof(user_code) / MBOX_WORD_BYTE; 65193a5b97eSSieu Mun Tang 65293a5b97eSSieu Mun Tang status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_GET_USERCODE, NULL, 65393a5b97eSSieu Mun Tang 0U, CMD_CASUAL, user_code, &resp_len); 65493a5b97eSSieu Mun Tang 65593a5b97eSSieu Mun Tang if (status < 0) { 65693a5b97eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 65793a5b97eSSieu Mun Tang } 65893a5b97eSSieu Mun Tang 65993a5b97eSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 66093a5b97eSSieu Mun Tang } 66193a5b97eSSieu Mun Tang 6624837a640SSieu Mun Tang uint32_t intel_smc_service_completed(uint64_t addr, uint32_t size, 6634837a640SSieu Mun Tang uint32_t mode, uint32_t *job_id, 6644837a640SSieu Mun Tang uint32_t *ret_size, uint32_t *mbox_error) 6654837a640SSieu Mun Tang { 6664837a640SSieu Mun Tang int status = 0; 6674837a640SSieu Mun Tang uint32_t resp_len = size / MBOX_WORD_BYTE; 6684837a640SSieu Mun Tang 6694837a640SSieu Mun Tang if (resp_len > MBOX_DATA_MAX_LEN) { 6704837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_REJECTED; 6714837a640SSieu Mun Tang } 6724837a640SSieu Mun Tang 6734837a640SSieu Mun Tang if (!is_address_in_ddr_range(addr, size)) { 6744837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_REJECTED; 6754837a640SSieu Mun Tang } 6764837a640SSieu Mun Tang 6774837a640SSieu Mun Tang if (mode == SERVICE_COMPLETED_MODE_ASYNC) { 6784837a640SSieu Mun Tang status = mailbox_read_response_async(job_id, 6794837a640SSieu Mun Tang NULL, (uint32_t *) addr, &resp_len, 0); 6804837a640SSieu Mun Tang } else { 6814837a640SSieu Mun Tang status = mailbox_read_response(job_id, 6824837a640SSieu Mun Tang (uint32_t *) addr, &resp_len); 6834837a640SSieu Mun Tang 6844837a640SSieu Mun Tang if (status == MBOX_NO_RESPONSE) { 6854837a640SSieu Mun Tang status = MBOX_BUSY; 6864837a640SSieu Mun Tang } 6874837a640SSieu Mun Tang } 6884837a640SSieu Mun Tang 6894837a640SSieu Mun Tang if (status == MBOX_NO_RESPONSE) { 6904837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_NO_RESPONSE; 6914837a640SSieu Mun Tang } 6924837a640SSieu Mun Tang 6934837a640SSieu Mun Tang if (status == MBOX_BUSY) { 6944837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_BUSY; 6954837a640SSieu Mun Tang } 6964837a640SSieu Mun Tang 6974837a640SSieu Mun Tang *ret_size = resp_len * MBOX_WORD_BYTE; 6984837a640SSieu Mun Tang flush_dcache_range(addr, *ret_size); 6994837a640SSieu Mun Tang 70076ed3223SSieu Mun Tang if (status == MBOX_RET_SDOS_DECRYPTION_ERROR_102 || 70176ed3223SSieu Mun Tang status == MBOX_RET_SDOS_DECRYPTION_ERROR_103) { 70276ed3223SSieu Mun Tang *mbox_error = -status; 70376ed3223SSieu Mun Tang } else if (status != MBOX_RET_OK) { 7044837a640SSieu Mun Tang *mbox_error = -status; 7054837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 7064837a640SSieu Mun Tang } 7074837a640SSieu Mun Tang 7084837a640SSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 7094837a640SSieu Mun Tang } 7104837a640SSieu Mun Tang 711b703facaSSieu Mun Tang /* Miscellaneous HPS services */ 712b703facaSSieu Mun Tang uint32_t intel_hps_set_bridges(uint64_t enable, uint64_t mask) 713b703facaSSieu Mun Tang { 714b703facaSSieu Mun Tang int status = 0; 715b703facaSSieu Mun Tang 716ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_ENABLE) != 0U) { 717ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 718b703facaSSieu Mun Tang status = socfpga_bridges_enable((uint32_t)mask); 719b703facaSSieu Mun Tang } else { 720b703facaSSieu Mun Tang status = socfpga_bridges_enable(~0); 721b703facaSSieu Mun Tang } 722b703facaSSieu Mun Tang } else { 723ad47f142SSieu Mun Tang if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 724b703facaSSieu Mun Tang status = socfpga_bridges_disable((uint32_t)mask); 725b703facaSSieu Mun Tang } else { 726b703facaSSieu Mun Tang status = socfpga_bridges_disable(~0); 727b703facaSSieu Mun Tang } 728b703facaSSieu Mun Tang } 729b703facaSSieu Mun Tang 730b703facaSSieu Mun Tang if (status < 0) { 731b703facaSSieu Mun Tang return INTEL_SIP_SMC_STATUS_ERROR; 732b703facaSSieu Mun Tang } 733b703facaSSieu Mun Tang 734b703facaSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 735b703facaSSieu Mun Tang } 736b703facaSSieu Mun Tang 73791239f2cSJit Loon Lim /* SDM SEU Error services */ 738fffcb25cSJit Loon Lim static uint32_t intel_sdm_seu_err_read(uint32_t *respbuf, unsigned int respbuf_sz) 73991239f2cSJit Loon Lim { 740fffcb25cSJit Loon Lim if (mailbox_seu_err_status(respbuf, respbuf_sz) < 0) { 741fffcb25cSJit Loon Lim return INTEL_SIP_SMC_SEU_ERR_READ_ERROR; 742fffcb25cSJit Loon Lim } 743fffcb25cSJit Loon Lim 744fffcb25cSJit Loon Lim return INTEL_SIP_SMC_STATUS_OK; 745fffcb25cSJit Loon Lim } 746fffcb25cSJit Loon Lim 747fffcb25cSJit Loon Lim /* SDM SAFE SEU Error inject services */ 748fffcb25cSJit Loon Lim static uint32_t intel_sdm_safe_inject_seu_err(uint32_t *command, uint32_t len) 749fffcb25cSJit Loon Lim { 750fffcb25cSJit Loon Lim if (mailbox_safe_inject_seu_err(command, len) < 0) { 75191239f2cSJit Loon Lim return INTEL_SIP_SMC_SEU_ERR_READ_ERROR; 75291239f2cSJit Loon Lim } 75391239f2cSJit Loon Lim 75491239f2cSJit Loon Lim return INTEL_SIP_SMC_STATUS_OK; 75591239f2cSJit Loon Lim } 75691239f2cSJit Loon Lim 757b727664eSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 758b727664eSSieu Mun Tang /* SMMU HPS Remapper */ 759b727664eSSieu Mun Tang void intel_smmu_hps_remapper_init(uint64_t *mem) 760b727664eSSieu Mun Tang { 761b727664eSSieu Mun Tang /* Read out Bit 1 value */ 762b727664eSSieu Mun Tang uint32_t remap = (mmio_read_32(SOCFPGA_SYSMGR(BOOT_SCRATCH_POR_1)) & 0x02); 763b727664eSSieu Mun Tang 764*ea906b9bSSieu Mun Tang if ((remap == 0x00) && (g_remapper_bypass == 0x00)) { 765b727664eSSieu Mun Tang /* Update DRAM Base address for SDM SMMU */ 766b727664eSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_ARADDR_REMAP), DRAM_BASE); 767b727664eSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_AWADDR_REMAP), DRAM_BASE); 768b727664eSSieu Mun Tang *mem = *mem - DRAM_BASE; 769b727664eSSieu Mun Tang } else { 770b727664eSSieu Mun Tang *mem = *mem - DRAM_BASE; 771b727664eSSieu Mun Tang } 772b727664eSSieu Mun Tang } 773*ea906b9bSSieu Mun Tang 774*ea906b9bSSieu Mun Tang int intel_smmu_hps_remapper_config(uint32_t remapper_bypass) 775*ea906b9bSSieu Mun Tang { 776*ea906b9bSSieu Mun Tang /* Read out the JTAG-ID from boot scratch register */ 777*ea906b9bSSieu Mun Tang if (is_agilex5_A5F0() != 0) { 778*ea906b9bSSieu Mun Tang if (remapper_bypass == 0x01) { 779*ea906b9bSSieu Mun Tang g_remapper_bypass = remapper_bypass; 780*ea906b9bSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_ARADDR_REMAP), 0); 781*ea906b9bSSieu Mun Tang mmio_write_32(SOCFPGA_SYSMGR(SDM_BE_AWADDR_REMAP), 0); 782*ea906b9bSSieu Mun Tang } 783*ea906b9bSSieu Mun Tang } 784*ea906b9bSSieu Mun Tang return INTEL_SIP_SMC_STATUS_OK; 785*ea906b9bSSieu Mun Tang } 786b727664eSSieu Mun Tang #endif 787b727664eSSieu Mun Tang 788c76d4239SHadi Asyrafi /* 789c76d4239SHadi Asyrafi * This function is responsible for handling all SiP calls from the NS world 790c76d4239SHadi Asyrafi */ 791c76d4239SHadi Asyrafi 792ad47f142SSieu Mun Tang uintptr_t sip_smc_handler_v1(uint32_t smc_fid, 793c76d4239SHadi Asyrafi u_register_t x1, 794c76d4239SHadi Asyrafi u_register_t x2, 795c76d4239SHadi Asyrafi u_register_t x3, 796c76d4239SHadi Asyrafi u_register_t x4, 797c76d4239SHadi Asyrafi void *cookie, 798c76d4239SHadi Asyrafi void *handle, 799c76d4239SHadi Asyrafi u_register_t flags) 800c76d4239SHadi Asyrafi { 801d1740831SSieu Mun Tang uint32_t retval = 0, completed_addr[3]; 802d1740831SSieu Mun Tang uint32_t retval2 = 0; 80377902fcaSSieu Mun Tang uint32_t mbox_error = 0; 804fffcb25cSJit Loon Lim uint64_t retval64, rsu_respbuf[9]; 805fffcb25cSJit Loon Lim uint32_t seu_respbuf[3]; 806286b96f4SSieu Mun Tang int status = INTEL_SIP_SMC_STATUS_OK; 807a250c04bSSieu Mun Tang int mbox_status; 808a250c04bSSieu Mun Tang unsigned int len_in_resp; 809c05ea296SSieu Mun Tang u_register_t x5, x6, x7; 810f8e6a09cSAbdul Halim, Muhammad Hadi Asyrafi 811c76d4239SHadi Asyrafi switch (smc_fid) { 812c76d4239SHadi Asyrafi case SIP_SVC_UID: 813c76d4239SHadi Asyrafi /* Return UID to the caller */ 814c76d4239SHadi Asyrafi SMC_UUID_RET(handle, intl_svc_uid); 81513d33d52SHadi Asyrafi 816c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_ISDONE: 817673afd6fSSieu Mun Tang status = intel_mailbox_fpga_config_isdone(); 818c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 81913d33d52SHadi Asyrafi 820c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM: 821c76d4239SHadi Asyrafi SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 822c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR, 823c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_SIZE - 824c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR); 82513d33d52SHadi Asyrafi 826c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_START: 827c76d4239SHadi Asyrafi status = intel_fpga_config_start(x1); 828c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 82913d33d52SHadi Asyrafi 830c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_WRITE: 831c76d4239SHadi Asyrafi status = intel_fpga_config_write(x1, x2); 832c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 83313d33d52SHadi Asyrafi 834c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE: 835c76d4239SHadi Asyrafi status = intel_fpga_config_completed_write(completed_addr, 836aad868b4SAbdul Halim, Muhammad Hadi Asyrafi &retval, &rcv_id); 837aad868b4SAbdul Halim, Muhammad Hadi Asyrafi switch (retval) { 838c76d4239SHadi Asyrafi case 1: 839c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 840c76d4239SHadi Asyrafi completed_addr[0], 0, 0); 84113d33d52SHadi Asyrafi 842c76d4239SHadi Asyrafi case 2: 843c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 844c76d4239SHadi Asyrafi completed_addr[0], 845c76d4239SHadi Asyrafi completed_addr[1], 0); 84613d33d52SHadi Asyrafi 847c76d4239SHadi Asyrafi case 3: 848c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 849c76d4239SHadi Asyrafi completed_addr[0], 850c76d4239SHadi Asyrafi completed_addr[1], 851c76d4239SHadi Asyrafi completed_addr[2]); 85213d33d52SHadi Asyrafi 853c76d4239SHadi Asyrafi case 0: 854c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 85513d33d52SHadi Asyrafi 856c76d4239SHadi Asyrafi default: 857cefb37ebSTien Hock, Loh mailbox_clear_response(); 858c76d4239SHadi Asyrafi SMC_RET1(handle, INTEL_SIP_SMC_STATUS_ERROR); 859c76d4239SHadi Asyrafi } 86013d33d52SHadi Asyrafi 86113d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_READ: 862aad868b4SAbdul Halim, Muhammad Hadi Asyrafi status = intel_secure_reg_read(x1, &retval); 863aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 86413d33d52SHadi Asyrafi 86513d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_WRITE: 866aad868b4SAbdul Halim, Muhammad Hadi Asyrafi status = intel_secure_reg_write(x1, (uint32_t)x2, &retval); 867aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 86813d33d52SHadi Asyrafi 86913d33d52SHadi Asyrafi case INTEL_SIP_SMC_REG_UPDATE: 87013d33d52SHadi Asyrafi status = intel_secure_reg_update(x1, (uint32_t)x2, 871aad868b4SAbdul Halim, Muhammad Hadi Asyrafi (uint32_t)x3, &retval); 872aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET3(handle, status, retval, x1); 873c76d4239SHadi Asyrafi 874e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_STATUS: 875e1f97d9cSHadi Asyrafi status = intel_rsu_status(rsu_respbuf, 876e1f97d9cSHadi Asyrafi ARRAY_SIZE(rsu_respbuf)); 877e1f97d9cSHadi Asyrafi if (status) { 878e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 879e1f97d9cSHadi Asyrafi } else { 880e1f97d9cSHadi Asyrafi SMC_RET4(handle, rsu_respbuf[0], rsu_respbuf[1], 881e1f97d9cSHadi Asyrafi rsu_respbuf[2], rsu_respbuf[3]); 882e1f97d9cSHadi Asyrafi } 883e1f97d9cSHadi Asyrafi 884e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_UPDATE: 885e1f97d9cSHadi Asyrafi status = intel_rsu_update(x1); 886e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 887e1f97d9cSHadi Asyrafi 888e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_NOTIFY: 889e1f97d9cSHadi Asyrafi status = intel_rsu_notify(x1); 890e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 891e1f97d9cSHadi Asyrafi 892e1f97d9cSHadi Asyrafi case INTEL_SIP_SMC_RSU_RETRY_COUNTER: 893e1f97d9cSHadi Asyrafi status = intel_rsu_retry_counter((uint32_t *)rsu_respbuf, 894aad868b4SAbdul Halim, Muhammad Hadi Asyrafi ARRAY_SIZE(rsu_respbuf), &retval); 895e1f97d9cSHadi Asyrafi if (status) { 896e1f97d9cSHadi Asyrafi SMC_RET1(handle, status); 897e1f97d9cSHadi Asyrafi } else { 898aad868b4SAbdul Halim, Muhammad Hadi Asyrafi SMC_RET2(handle, status, retval); 899e1f97d9cSHadi Asyrafi } 900e1f97d9cSHadi Asyrafi 90144eb782eSChee Hong Ang case INTEL_SIP_SMC_RSU_DCMF_VERSION: 90244eb782eSChee Hong Ang SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 90344eb782eSChee Hong Ang ((uint64_t)rsu_dcmf_ver[1] << 32) | rsu_dcmf_ver[0], 90444eb782eSChee Hong Ang ((uint64_t)rsu_dcmf_ver[3] << 32) | rsu_dcmf_ver[2]); 90544eb782eSChee Hong Ang 90644eb782eSChee Hong Ang case INTEL_SIP_SMC_RSU_COPY_DCMF_VERSION: 90744eb782eSChee Hong Ang status = intel_rsu_copy_dcmf_version(x1, x2); 90844eb782eSChee Hong Ang SMC_RET1(handle, status); 90944eb782eSChee Hong Ang 9108fb1b484SKah Jing Lee case INTEL_SIP_SMC_RSU_GET_DEVICE_INFO: 9118fb1b484SKah Jing Lee status = intel_rsu_get_device_info((uint32_t *)rsu_respbuf, 9128fb1b484SKah Jing Lee ARRAY_SIZE(rsu_respbuf)); 9138fb1b484SKah Jing Lee if (status) { 9148fb1b484SKah Jing Lee SMC_RET1(handle, status); 9158fb1b484SKah Jing Lee } else { 9168fb1b484SKah Jing Lee SMC_RET5(handle, status, rsu_respbuf[0], rsu_respbuf[1], 9178fb1b484SKah Jing Lee rsu_respbuf[2], rsu_respbuf[3]); 9188fb1b484SKah Jing Lee } 9198fb1b484SKah Jing Lee 920984e236eSSieu Mun Tang case INTEL_SIP_SMC_RSU_DCMF_STATUS: 921984e236eSSieu Mun Tang SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, 922984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[3] << 48) | 923984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[2] << 32) | 924984e236eSSieu Mun Tang ((uint64_t)rsu_dcmf_stat[1] << 16) | 925984e236eSSieu Mun Tang rsu_dcmf_stat[0]); 926984e236eSSieu Mun Tang 927984e236eSSieu Mun Tang case INTEL_SIP_SMC_RSU_COPY_DCMF_STATUS: 928984e236eSSieu Mun Tang status = intel_rsu_copy_dcmf_status(x1); 929984e236eSSieu Mun Tang SMC_RET1(handle, status); 930984e236eSSieu Mun Tang 9314c26957bSChee Hong Ang case INTEL_SIP_SMC_RSU_MAX_RETRY: 9324c26957bSChee Hong Ang SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, rsu_max_retry); 9334c26957bSChee Hong Ang 9344c26957bSChee Hong Ang case INTEL_SIP_SMC_RSU_COPY_MAX_RETRY: 9354c26957bSChee Hong Ang rsu_max_retry = x1; 9364c26957bSChee Hong Ang SMC_RET1(handle, INTEL_SIP_SMC_STATUS_OK); 9374c26957bSChee Hong Ang 938c703d752SSieu Mun Tang case INTEL_SIP_SMC_ECC_DBE: 939c703d752SSieu Mun Tang status = intel_ecc_dbe_notification(x1); 940c703d752SSieu Mun Tang SMC_RET1(handle, status); 941c703d752SSieu Mun Tang 942b703facaSSieu Mun Tang case INTEL_SIP_SMC_SERVICE_COMPLETED: 943b703facaSSieu Mun Tang status = intel_smc_service_completed(x1, x2, x3, &rcv_id, 944b703facaSSieu Mun Tang &len_in_resp, &mbox_error); 945b703facaSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, len_in_resp); 946b703facaSSieu Mun Tang 947c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi case INTEL_SIP_SMC_FIRMWARE_VERSION: 948c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi status = intel_smc_fw_version(&retval); 949c026dfe3SSieu Mun Tang SMC_RET2(handle, status, retval); 950c34b2a7aSAbdul Halim, Muhammad Hadi Asyrafi 9510c5d62adSHadi Asyrafi case INTEL_SIP_SMC_MBOX_SEND_CMD: 9520c5d62adSHadi Asyrafi x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 9530c5d62adSHadi Asyrafi x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 954ac097fdfSSieu Mun Tang status = intel_mbox_send_cmd(x1, (uint32_t *)x2, x3, x4, x5, x6, 955ac097fdfSSieu Mun Tang &mbox_status, &len_in_resp); 956108514ffSSieu Mun Tang SMC_RET3(handle, status, mbox_status, len_in_resp); 9570c5d62adSHadi Asyrafi 95893a5b97eSSieu Mun Tang case INTEL_SIP_SMC_GET_USERCODE: 95993a5b97eSSieu Mun Tang status = intel_smc_get_usercode(&retval); 96093a5b97eSSieu Mun Tang SMC_RET2(handle, status, retval); 96193a5b97eSSieu Mun Tang 96202d3ef33SSieu Mun Tang case INTEL_SIP_SMC_FCS_CRYPTION: 96302d3ef33SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 96402d3ef33SSieu Mun Tang 96502d3ef33SSieu Mun Tang if (x1 == FCS_MODE_DECRYPT) { 96602d3ef33SSieu Mun Tang status = intel_fcs_decryption(x2, x3, x4, x5, &send_id); 96702d3ef33SSieu Mun Tang } else if (x1 == FCS_MODE_ENCRYPT) { 96802d3ef33SSieu Mun Tang status = intel_fcs_encryption(x2, x3, x4, x5, &send_id); 96902d3ef33SSieu Mun Tang } else { 97002d3ef33SSieu Mun Tang status = INTEL_SIP_SMC_STATUS_REJECTED; 97102d3ef33SSieu Mun Tang } 97202d3ef33SSieu Mun Tang 97302d3ef33SSieu Mun Tang SMC_RET3(handle, status, x4, x5); 97402d3ef33SSieu Mun Tang 975537ff052SSieu Mun Tang case INTEL_SIP_SMC_FCS_CRYPTION_EXT: 976537ff052SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 977537ff052SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 978537ff052SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 979537ff052SSieu Mun Tang 980537ff052SSieu Mun Tang if (x3 == FCS_MODE_DECRYPT) { 981537ff052SSieu Mun Tang status = intel_fcs_decryption_ext(x1, x2, x4, x5, x6, 982537ff052SSieu Mun Tang (uint32_t *) &x7, &mbox_error); 983537ff052SSieu Mun Tang } else if (x3 == FCS_MODE_ENCRYPT) { 984537ff052SSieu Mun Tang status = intel_fcs_encryption_ext(x1, x2, x4, x5, x6, 985537ff052SSieu Mun Tang (uint32_t *) &x7, &mbox_error); 986537ff052SSieu Mun Tang } else { 987537ff052SSieu Mun Tang status = INTEL_SIP_SMC_STATUS_REJECTED; 988537ff052SSieu Mun Tang } 989537ff052SSieu Mun Tang 990537ff052SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x6, x7); 991537ff052SSieu Mun Tang 9924837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_RANDOM_NUMBER: 9934837a640SSieu Mun Tang status = intel_fcs_random_number_gen(x1, &retval64, 9944837a640SSieu Mun Tang &mbox_error); 9954837a640SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, retval64); 9964837a640SSieu Mun Tang 99724f9dc8aSSieu Mun Tang case INTEL_SIP_SMC_FCS_RANDOM_NUMBER_EXT: 99824f9dc8aSSieu Mun Tang status = intel_fcs_random_number_gen_ext(x1, x2, x3, 99924f9dc8aSSieu Mun Tang &send_id); 100024f9dc8aSSieu Mun Tang SMC_RET1(handle, status); 100124f9dc8aSSieu Mun Tang 10024837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_SEND_CERTIFICATE: 10034837a640SSieu Mun Tang status = intel_fcs_send_cert(x1, x2, &send_id); 10044837a640SSieu Mun Tang SMC_RET1(handle, status); 10054837a640SSieu Mun Tang 10064837a640SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_PROVISION_DATA: 10074837a640SSieu Mun Tang status = intel_fcs_get_provision_data(&send_id); 10084837a640SSieu Mun Tang SMC_RET1(handle, status); 10094837a640SSieu Mun Tang 10107facacecSSieu Mun Tang case INTEL_SIP_SMC_FCS_CNTR_SET_PREAUTH: 10117facacecSSieu Mun Tang status = intel_fcs_cntr_set_preauth(x1, x2, x3, 10127facacecSSieu Mun Tang &mbox_error); 10137facacecSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10147facacecSSieu Mun Tang 101511f4f030SSieu Mun Tang case INTEL_SIP_SMC_HPS_SET_BRIDGES: 101611f4f030SSieu Mun Tang status = intel_hps_set_bridges(x1, x2); 101711f4f030SSieu Mun Tang SMC_RET1(handle, status); 101811f4f030SSieu Mun Tang 1019ad47f142SSieu Mun Tang case INTEL_SIP_SMC_HWMON_READTEMP: 1020ad47f142SSieu Mun Tang status = intel_hwmon_readtemp(x1, &retval); 1021ad47f142SSieu Mun Tang SMC_RET2(handle, status, retval); 1022ad47f142SSieu Mun Tang 1023ad47f142SSieu Mun Tang case INTEL_SIP_SMC_HWMON_READVOLT: 1024ad47f142SSieu Mun Tang status = intel_hwmon_readvolt(x1, &retval); 1025ad47f142SSieu Mun Tang SMC_RET2(handle, status, retval); 1026ad47f142SSieu Mun Tang 1027d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_PSGSIGMA_TEARDOWN: 1028d1740831SSieu Mun Tang status = intel_fcs_sigma_teardown(x1, &mbox_error); 1029d1740831SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1030d1740831SSieu Mun Tang 1031d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_CHIP_ID: 1032d1740831SSieu Mun Tang status = intel_fcs_chip_id(&retval, &retval2, &mbox_error); 1033d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, retval, retval2); 1034d1740831SSieu Mun Tang 1035d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_ATTESTATION_SUBKEY: 1036d1740831SSieu Mun Tang status = intel_fcs_attestation_subkey(x1, x2, x3, 1037d1740831SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1038d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1039d1740831SSieu Mun Tang 1040d1740831SSieu Mun Tang case INTEL_SIP_SMC_FCS_ATTESTATION_MEASUREMENTS: 1041d1740831SSieu Mun Tang status = intel_fcs_get_measurement(x1, x2, x3, 1042d1740831SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1043d1740831SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1044d1740831SSieu Mun Tang 1045581182c1SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_ATTESTATION_CERT: 1046581182c1SSieu Mun Tang status = intel_fcs_get_attestation_cert(x1, x2, 1047581182c1SSieu Mun Tang (uint32_t *) &x3, &mbox_error); 1048581182c1SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x2, x3); 1049581182c1SSieu Mun Tang 1050581182c1SSieu Mun Tang case INTEL_SIP_SMC_FCS_CREATE_CERT_ON_RELOAD: 1051581182c1SSieu Mun Tang status = intel_fcs_create_cert_on_reload(x1, &mbox_error); 1052581182c1SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1053581182c1SSieu Mun Tang 10546dc00c24SSieu Mun Tang case INTEL_SIP_SMC_FCS_OPEN_CS_SESSION: 10556dc00c24SSieu Mun Tang status = intel_fcs_open_crypto_service_session(&retval, &mbox_error); 10566dc00c24SSieu Mun Tang SMC_RET3(handle, status, mbox_error, retval); 10576dc00c24SSieu Mun Tang 10586dc00c24SSieu Mun Tang case INTEL_SIP_SMC_FCS_CLOSE_CS_SESSION: 10596dc00c24SSieu Mun Tang status = intel_fcs_close_crypto_service_session(x1, &mbox_error); 10606dc00c24SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10616dc00c24SSieu Mun Tang 1062342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_IMPORT_CS_KEY: 1063342a0618SSieu Mun Tang status = intel_fcs_import_crypto_service_key(x1, x2, &send_id); 1064342a0618SSieu Mun Tang SMC_RET1(handle, status); 1065342a0618SSieu Mun Tang 1066342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_EXPORT_CS_KEY: 1067342a0618SSieu Mun Tang status = intel_fcs_export_crypto_service_key(x1, x2, x3, 1068342a0618SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1069342a0618SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1070342a0618SSieu Mun Tang 1071342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_REMOVE_CS_KEY: 1072342a0618SSieu Mun Tang status = intel_fcs_remove_crypto_service_key(x1, x2, 1073342a0618SSieu Mun Tang &mbox_error); 1074342a0618SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1075342a0618SSieu Mun Tang 1076342a0618SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_CS_KEY_INFO: 1077342a0618SSieu Mun Tang status = intel_fcs_get_crypto_service_key_info(x1, x2, x3, 1078342a0618SSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1079342a0618SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1080342a0618SSieu Mun Tang 10817e8249a2SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_INIT: 10827e8249a2SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10837e8249a2SSieu Mun Tang status = intel_fcs_get_digest_init(x1, x2, x3, 10847e8249a2SSieu Mun Tang x4, x5, &mbox_error); 10857e8249a2SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 10867e8249a2SSieu Mun Tang 108770a7e6afSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_UPDATE: 108870a7e6afSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 108970a7e6afSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 109070a7e6afSSieu Mun Tang status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 109170a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, false, 109270a7e6afSSieu Mun Tang &mbox_error); 109370a7e6afSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 109470a7e6afSSieu Mun Tang 10957e8249a2SSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_FINALIZE: 10967e8249a2SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 10977e8249a2SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 109870a7e6afSSieu Mun Tang status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 109970a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, true, 110070a7e6afSSieu Mun Tang &mbox_error); 11017e8249a2SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11027e8249a2SSieu Mun Tang 11034687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_UPDATE: 11044687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11054687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11064687021dSSieu Mun Tang status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 11074687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, false, 11084687021dSSieu Mun Tang &mbox_error, &send_id); 11094687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11104687021dSSieu Mun Tang 11114687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_FINALIZE: 11124687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11134687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11144687021dSSieu Mun Tang status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 11154687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, true, 11164687021dSSieu Mun Tang &mbox_error, &send_id); 11174687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11184687021dSSieu Mun Tang 1119c05ea296SSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_INIT: 1120c05ea296SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1121c05ea296SSieu Mun Tang status = intel_fcs_mac_verify_init(x1, x2, x3, 1122c05ea296SSieu Mun Tang x4, x5, &mbox_error); 1123c05ea296SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1124c05ea296SSieu Mun Tang 112570a7e6afSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_UPDATE: 112670a7e6afSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 112770a7e6afSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 112870a7e6afSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 112970a7e6afSSieu Mun Tang status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 113070a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 113170a7e6afSSieu Mun Tang false, &mbox_error); 113270a7e6afSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 113370a7e6afSSieu Mun Tang 1134c05ea296SSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_FINALIZE: 1135c05ea296SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1136c05ea296SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1137c05ea296SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 113870a7e6afSSieu Mun Tang status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 113970a7e6afSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 114070a7e6afSSieu Mun Tang true, &mbox_error); 1141c05ea296SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 1142c05ea296SSieu Mun Tang 11434687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_UPDATE: 11444687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11454687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11464687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 11474687021dSSieu Mun Tang status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 11484687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 11494687021dSSieu Mun Tang false, &mbox_error, &send_id); 11504687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11514687021dSSieu Mun Tang 11524687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_FINALIZE: 11534687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11544687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11554687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 11564687021dSSieu Mun Tang status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 11574687021dSSieu Mun Tang x4, x5, (uint32_t *) &x6, x7, 11584687021dSSieu Mun Tang true, &mbox_error, &send_id); 11594687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11604687021dSSieu Mun Tang 116107912da1SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_INIT: 116207912da1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 116307912da1SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_init(x1, x2, x3, 116407912da1SSieu Mun Tang x4, x5, &mbox_error); 116507912da1SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 116607912da1SSieu Mun Tang 11671d97dd74SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_UPDATE: 11681d97dd74SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11691d97dd74SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11701d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 11711d97dd74SSieu Mun Tang x3, x4, x5, (uint32_t *) &x6, false, 11721d97dd74SSieu Mun Tang &mbox_error); 11731d97dd74SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11741d97dd74SSieu Mun Tang 117507912da1SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_FINALIZE: 117607912da1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 117707912da1SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11781d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 11791d97dd74SSieu Mun Tang x3, x4, x5, (uint32_t *) &x6, true, 11801d97dd74SSieu Mun Tang &mbox_error); 118107912da1SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 118207912da1SSieu Mun Tang 11834687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_UPDATE: 11844687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11854687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11864687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 11874687021dSSieu Mun Tang x2, x3, x4, x5, (uint32_t *) &x6, false, 11884687021dSSieu Mun Tang &mbox_error, &send_id); 11894687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11904687021dSSieu Mun Tang 11914687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_FINALIZE: 11924687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 11934687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 11944687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 11954687021dSSieu Mun Tang x2, x3, x4, x5, (uint32_t *) &x6, true, 11964687021dSSieu Mun Tang &mbox_error, &send_id); 11974687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 11984687021dSSieu Mun Tang 119969254105SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_INIT: 120069254105SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 120169254105SSieu Mun Tang status = intel_fcs_ecdsa_hash_sign_init(x1, x2, x3, 120269254105SSieu Mun Tang x4, x5, &mbox_error); 120369254105SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 120469254105SSieu Mun Tang 120569254105SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_FINALIZE: 120669254105SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 120769254105SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 120869254105SSieu Mun Tang status = intel_fcs_ecdsa_hash_sign_finalize(x1, x2, x3, 120969254105SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 121069254105SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 121169254105SSieu Mun Tang 12127e25eb87SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_INIT: 12137e25eb87SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12147e25eb87SSieu Mun Tang status = intel_fcs_ecdsa_hash_sig_verify_init(x1, x2, x3, 12157e25eb87SSieu Mun Tang x4, x5, &mbox_error); 12167e25eb87SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 12177e25eb87SSieu Mun Tang 12187e25eb87SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_FINALIZE: 12197e25eb87SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12207e25eb87SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12217e25eb87SSieu Mun Tang status = intel_fcs_ecdsa_hash_sig_verify_finalize(x1, x2, x3, 12227e25eb87SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 12237e25eb87SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12247e25eb87SSieu Mun Tang 122558305060SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_INIT: 122658305060SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 122758305060SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_init(x1, x2, x3, 122858305060SSieu Mun Tang x4, x5, &mbox_error); 122958305060SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 123058305060SSieu Mun Tang 12311d97dd74SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_UPDATE: 12321d97dd74SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12331d97dd74SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12341d97dd74SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12351d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 12361d97dd74SSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12371d97dd74SSieu Mun Tang x7, false, &mbox_error); 12381d97dd74SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12391d97dd74SSieu Mun Tang 12404687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_UPDATE: 12414687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12424687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12434687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12444687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 12454687021dSSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12464687021dSSieu Mun Tang x7, false, &mbox_error, &send_id); 12474687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12484687021dSSieu Mun Tang 12494687021dSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_FINALIZE: 12504687021dSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12514687021dSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 12524687021dSSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12534687021dSSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 12544687021dSSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12554687021dSSieu Mun Tang x7, true, &mbox_error, &send_id); 12564687021dSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 12574687021dSSieu Mun Tang 125858305060SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_FINALIZE: 125958305060SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 126058305060SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 126158305060SSieu Mun Tang x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 12621d97dd74SSieu Mun Tang status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 12631d97dd74SSieu Mun Tang x1, x2, x3, x4, x5, (uint32_t *) &x6, 12641d97dd74SSieu Mun Tang x7, true, &mbox_error); 126558305060SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 126607912da1SSieu Mun Tang 1267d2fee94aSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_INIT: 1268d2fee94aSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1269d2fee94aSSieu Mun Tang status = intel_fcs_ecdsa_get_pubkey_init(x1, x2, x3, 1270d2fee94aSSieu Mun Tang x4, x5, &mbox_error); 1271d2fee94aSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 1272d2fee94aSSieu Mun Tang 1273d2fee94aSSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_FINALIZE: 1274d2fee94aSSieu Mun Tang status = intel_fcs_ecdsa_get_pubkey_finalize(x1, x2, x3, 1275d2fee94aSSieu Mun Tang (uint32_t *) &x4, &mbox_error); 1276d2fee94aSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x3, x4); 1277d2fee94aSSieu Mun Tang 127849446866SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDH_REQUEST_INIT: 127949446866SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 128049446866SSieu Mun Tang status = intel_fcs_ecdh_request_init(x1, x2, x3, 128149446866SSieu Mun Tang x4, x5, &mbox_error); 128249446866SSieu Mun Tang SMC_RET2(handle, status, mbox_error); 128349446866SSieu Mun Tang 128449446866SSieu Mun Tang case INTEL_SIP_SMC_FCS_ECDH_REQUEST_FINALIZE: 128549446866SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 128649446866SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 128749446866SSieu Mun Tang status = intel_fcs_ecdh_request_finalize(x1, x2, x3, 128849446866SSieu Mun Tang x4, x5, (uint32_t *) &x6, &mbox_error); 128949446866SSieu Mun Tang SMC_RET4(handle, status, mbox_error, x5, x6); 129049446866SSieu Mun Tang 12916726390eSSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_INIT: 12926726390eSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 12936726390eSSieu Mun Tang status = intel_fcs_aes_crypt_init(x1, x2, x3, x4, x5, 12946726390eSSieu Mun Tang &mbox_error); 12956726390eSSieu Mun Tang SMC_RET2(handle, status, mbox_error); 12966726390eSSieu Mun Tang 1297dcb144f1SSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_UPDATE: 1298dcb144f1SSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1299dcb144f1SSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1300dcb144f1SSieu Mun Tang status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1301dcb144f1SSieu Mun Tang x5, x6, false, &send_id); 1302dcb144f1SSieu Mun Tang SMC_RET1(handle, status); 1303dcb144f1SSieu Mun Tang 13046726390eSSieu Mun Tang case INTEL_SIP_SMC_FCS_AES_CRYPT_FINALIZE: 13056726390eSSieu Mun Tang x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 13066726390eSSieu Mun Tang x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1307dcb144f1SSieu Mun Tang status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1308dcb144f1SSieu Mun Tang x5, x6, true, &send_id); 13096726390eSSieu Mun Tang SMC_RET1(handle, status); 13106726390eSSieu Mun Tang 1311*ea906b9bSSieu Mun Tang #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 1312*ea906b9bSSieu Mun Tang case INTEL_SIP_SMC_FCS_SDM_REMAPPER_CONFIG: 1313*ea906b9bSSieu Mun Tang status = intel_smmu_hps_remapper_config(x1); 1314*ea906b9bSSieu Mun Tang SMC_RET1(handle, status); 1315*ea906b9bSSieu Mun Tang #endif 1316*ea906b9bSSieu Mun Tang 131777902fcaSSieu Mun Tang case INTEL_SIP_SMC_GET_ROM_PATCH_SHA384: 131877902fcaSSieu Mun Tang status = intel_fcs_get_rom_patch_sha384(x1, &retval64, 131977902fcaSSieu Mun Tang &mbox_error); 132077902fcaSSieu Mun Tang SMC_RET4(handle, status, mbox_error, x1, retval64); 132177902fcaSSieu Mun Tang 1322f0c40b89SSieu Mun Tang case INTEL_SIP_SMC_SVC_VERSION: 1323f0c40b89SSieu Mun Tang SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 1324f0c40b89SSieu Mun Tang SIP_SVC_VERSION_MAJOR, 1325f0c40b89SSieu Mun Tang SIP_SVC_VERSION_MINOR); 1326f0c40b89SSieu Mun Tang 132791239f2cSJit Loon Lim case INTEL_SIP_SMC_SEU_ERR_STATUS: 132891239f2cSJit Loon Lim status = intel_sdm_seu_err_read(seu_respbuf, 132991239f2cSJit Loon Lim ARRAY_SIZE(seu_respbuf)); 133091239f2cSJit Loon Lim if (status) { 133191239f2cSJit Loon Lim SMC_RET1(handle, status); 133291239f2cSJit Loon Lim } else { 133391239f2cSJit Loon Lim SMC_RET3(handle, seu_respbuf[0], seu_respbuf[1], seu_respbuf[2]); 133491239f2cSJit Loon Lim } 133591239f2cSJit Loon Lim 1336fffcb25cSJit Loon Lim case INTEL_SIP_SMC_SAFE_INJECT_SEU_ERR: 1337fffcb25cSJit Loon Lim status = intel_sdm_safe_inject_seu_err((uint32_t *)&x1, (uint32_t)x2); 1338fffcb25cSJit Loon Lim SMC_RET1(handle, status); 1339fffcb25cSJit Loon Lim 1340c76d4239SHadi Asyrafi default: 1341c76d4239SHadi Asyrafi return socfpga_sip_handler(smc_fid, x1, x2, x3, x4, 1342c76d4239SHadi Asyrafi cookie, handle, flags); 1343c76d4239SHadi Asyrafi } 1344c76d4239SHadi Asyrafi } 1345c76d4239SHadi Asyrafi 1346ad47f142SSieu Mun Tang uintptr_t sip_smc_handler(uint32_t smc_fid, 1347ad47f142SSieu Mun Tang u_register_t x1, 1348ad47f142SSieu Mun Tang u_register_t x2, 1349ad47f142SSieu Mun Tang u_register_t x3, 1350ad47f142SSieu Mun Tang u_register_t x4, 1351ad47f142SSieu Mun Tang void *cookie, 1352ad47f142SSieu Mun Tang void *handle, 1353ad47f142SSieu Mun Tang u_register_t flags) 1354ad47f142SSieu Mun Tang { 1355ad47f142SSieu Mun Tang uint32_t cmd = smc_fid & INTEL_SIP_SMC_CMD_MASK; 1356ad47f142SSieu Mun Tang 1357ad47f142SSieu Mun Tang if (cmd >= INTEL_SIP_SMC_CMD_V2_RANGE_BEGIN && 1358ad47f142SSieu Mun Tang cmd <= INTEL_SIP_SMC_CMD_V2_RANGE_END) { 1359ad47f142SSieu Mun Tang return sip_smc_handler_v2(smc_fid, x1, x2, x3, x4, 1360ad47f142SSieu Mun Tang cookie, handle, flags); 1361ad47f142SSieu Mun Tang } else { 1362ad47f142SSieu Mun Tang return sip_smc_handler_v1(smc_fid, x1, x2, x3, x4, 1363ad47f142SSieu Mun Tang cookie, handle, flags); 1364ad47f142SSieu Mun Tang } 1365ad47f142SSieu Mun Tang } 1366ad47f142SSieu Mun Tang 1367c76d4239SHadi Asyrafi DECLARE_RT_SVC( 1368c76d4239SHadi Asyrafi socfpga_sip_svc, 1369c76d4239SHadi Asyrafi OEN_SIP_START, 1370c76d4239SHadi Asyrafi OEN_SIP_END, 1371c76d4239SHadi Asyrafi SMC_TYPE_FAST, 1372c76d4239SHadi Asyrafi NULL, 1373c76d4239SHadi Asyrafi sip_smc_handler 1374c76d4239SHadi Asyrafi ); 1375c76d4239SHadi Asyrafi 1376c76d4239SHadi Asyrafi DECLARE_RT_SVC( 1377c76d4239SHadi Asyrafi socfpga_sip_svc_std, 1378c76d4239SHadi Asyrafi OEN_SIP_START, 1379c76d4239SHadi Asyrafi OEN_SIP_END, 1380c76d4239SHadi Asyrafi SMC_TYPE_YIELD, 1381c76d4239SHadi Asyrafi NULL, 1382c76d4239SHadi Asyrafi sip_smc_handler 1383c76d4239SHadi Asyrafi ); 1384