1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu #include <common/debug.h> 9*91f16700Schasinglulu #include <common/runtime_svc.h> 10*91f16700Schasinglulu #include <lib/mmio.h> 11*91f16700Schasinglulu #include <tools_share/uuid.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include "socfpga_fcs.h" 14*91f16700Schasinglulu #include "socfpga_mailbox.h" 15*91f16700Schasinglulu #include "socfpga_plat_def.h" 16*91f16700Schasinglulu #include "socfpga_reset_manager.h" 17*91f16700Schasinglulu #include "socfpga_sip_svc.h" 18*91f16700Schasinglulu #include "socfpga_system_manager.h" 19*91f16700Schasinglulu 20*91f16700Schasinglulu /* Total buffer the driver can hold */ 21*91f16700Schasinglulu #define FPGA_CONFIG_BUFFER_SIZE 4 22*91f16700Schasinglulu 23*91f16700Schasinglulu static config_type request_type = NO_REQUEST; 24*91f16700Schasinglulu static int current_block, current_buffer; 25*91f16700Schasinglulu static int read_block, max_blocks; 26*91f16700Schasinglulu static uint32_t send_id, rcv_id; 27*91f16700Schasinglulu static uint32_t bytes_per_block, blocks_submitted; 28*91f16700Schasinglulu static bool bridge_disable; 29*91f16700Schasinglulu 30*91f16700Schasinglulu /* RSU static variables */ 31*91f16700Schasinglulu static uint32_t rsu_dcmf_ver[4] = {0}; 32*91f16700Schasinglulu static uint16_t rsu_dcmf_stat[4] = {0}; 33*91f16700Schasinglulu static uint32_t rsu_max_retry; 34*91f16700Schasinglulu 35*91f16700Schasinglulu /* SiP Service UUID */ 36*91f16700Schasinglulu DEFINE_SVC_UUID2(intl_svc_uid, 37*91f16700Schasinglulu 0xa85273b0, 0xe85a, 0x4862, 0xa6, 0x2a, 38*91f16700Schasinglulu 0xfa, 0x88, 0x88, 0x17, 0x68, 0x81); 39*91f16700Schasinglulu 40*91f16700Schasinglulu static uint64_t socfpga_sip_handler(uint32_t smc_fid, 41*91f16700Schasinglulu uint64_t x1, 42*91f16700Schasinglulu uint64_t x2, 43*91f16700Schasinglulu uint64_t x3, 44*91f16700Schasinglulu uint64_t x4, 45*91f16700Schasinglulu void *cookie, 46*91f16700Schasinglulu void *handle, 47*91f16700Schasinglulu uint64_t flags) 48*91f16700Schasinglulu { 49*91f16700Schasinglulu ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); 50*91f16700Schasinglulu SMC_RET1(handle, SMC_UNK); 51*91f16700Schasinglulu } 52*91f16700Schasinglulu 53*91f16700Schasinglulu struct fpga_config_info fpga_config_buffers[FPGA_CONFIG_BUFFER_SIZE]; 54*91f16700Schasinglulu 55*91f16700Schasinglulu static int intel_fpga_sdm_write_buffer(struct fpga_config_info *buffer) 56*91f16700Schasinglulu { 57*91f16700Schasinglulu uint32_t args[3]; 58*91f16700Schasinglulu 59*91f16700Schasinglulu while (max_blocks > 0 && buffer->size > buffer->size_written) { 60*91f16700Schasinglulu args[0] = (1<<8); 61*91f16700Schasinglulu args[1] = buffer->addr + buffer->size_written; 62*91f16700Schasinglulu if (buffer->size - buffer->size_written <= bytes_per_block) { 63*91f16700Schasinglulu args[2] = buffer->size - buffer->size_written; 64*91f16700Schasinglulu current_buffer++; 65*91f16700Schasinglulu current_buffer %= FPGA_CONFIG_BUFFER_SIZE; 66*91f16700Schasinglulu } else { 67*91f16700Schasinglulu args[2] = bytes_per_block; 68*91f16700Schasinglulu } 69*91f16700Schasinglulu 70*91f16700Schasinglulu buffer->size_written += args[2]; 71*91f16700Schasinglulu mailbox_send_cmd_async(&send_id, MBOX_RECONFIG_DATA, args, 72*91f16700Schasinglulu 3U, CMD_INDIRECT); 73*91f16700Schasinglulu 74*91f16700Schasinglulu buffer->subblocks_sent++; 75*91f16700Schasinglulu max_blocks--; 76*91f16700Schasinglulu } 77*91f16700Schasinglulu 78*91f16700Schasinglulu return !max_blocks; 79*91f16700Schasinglulu } 80*91f16700Schasinglulu 81*91f16700Schasinglulu static int intel_fpga_sdm_write_all(void) 82*91f16700Schasinglulu { 83*91f16700Schasinglulu for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 84*91f16700Schasinglulu if (intel_fpga_sdm_write_buffer( 85*91f16700Schasinglulu &fpga_config_buffers[current_buffer])) { 86*91f16700Schasinglulu break; 87*91f16700Schasinglulu } 88*91f16700Schasinglulu } 89*91f16700Schasinglulu return 0; 90*91f16700Schasinglulu } 91*91f16700Schasinglulu 92*91f16700Schasinglulu static uint32_t intel_mailbox_fpga_config_isdone(void) 93*91f16700Schasinglulu { 94*91f16700Schasinglulu uint32_t ret; 95*91f16700Schasinglulu 96*91f16700Schasinglulu switch (request_type) { 97*91f16700Schasinglulu case RECONFIGURATION: 98*91f16700Schasinglulu ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, 99*91f16700Schasinglulu true); 100*91f16700Schasinglulu break; 101*91f16700Schasinglulu case BITSTREAM_AUTH: 102*91f16700Schasinglulu ret = intel_mailbox_get_config_status(MBOX_RECONFIG_STATUS, 103*91f16700Schasinglulu false); 104*91f16700Schasinglulu break; 105*91f16700Schasinglulu default: 106*91f16700Schasinglulu ret = intel_mailbox_get_config_status(MBOX_CONFIG_STATUS, 107*91f16700Schasinglulu false); 108*91f16700Schasinglulu break; 109*91f16700Schasinglulu } 110*91f16700Schasinglulu 111*91f16700Schasinglulu if (ret != 0U) { 112*91f16700Schasinglulu if (ret == MBOX_CFGSTAT_STATE_CONFIG) { 113*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_BUSY; 114*91f16700Schasinglulu } else { 115*91f16700Schasinglulu request_type = NO_REQUEST; 116*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 117*91f16700Schasinglulu } 118*91f16700Schasinglulu } 119*91f16700Schasinglulu 120*91f16700Schasinglulu if (bridge_disable != 0U) { 121*91f16700Schasinglulu socfpga_bridges_enable(~0); /* Enable bridge */ 122*91f16700Schasinglulu bridge_disable = false; 123*91f16700Schasinglulu } 124*91f16700Schasinglulu request_type = NO_REQUEST; 125*91f16700Schasinglulu 126*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 127*91f16700Schasinglulu } 128*91f16700Schasinglulu 129*91f16700Schasinglulu static int mark_last_buffer_xfer_completed(uint32_t *buffer_addr_completed) 130*91f16700Schasinglulu { 131*91f16700Schasinglulu int i; 132*91f16700Schasinglulu 133*91f16700Schasinglulu for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 134*91f16700Schasinglulu if (fpga_config_buffers[i].block_number == current_block) { 135*91f16700Schasinglulu fpga_config_buffers[i].subblocks_sent--; 136*91f16700Schasinglulu if (fpga_config_buffers[i].subblocks_sent == 0 137*91f16700Schasinglulu && fpga_config_buffers[i].size <= 138*91f16700Schasinglulu fpga_config_buffers[i].size_written) { 139*91f16700Schasinglulu fpga_config_buffers[i].write_requested = 0; 140*91f16700Schasinglulu current_block++; 141*91f16700Schasinglulu *buffer_addr_completed = 142*91f16700Schasinglulu fpga_config_buffers[i].addr; 143*91f16700Schasinglulu return 0; 144*91f16700Schasinglulu } 145*91f16700Schasinglulu } 146*91f16700Schasinglulu } 147*91f16700Schasinglulu 148*91f16700Schasinglulu return -1; 149*91f16700Schasinglulu } 150*91f16700Schasinglulu 151*91f16700Schasinglulu static int intel_fpga_config_completed_write(uint32_t *completed_addr, 152*91f16700Schasinglulu uint32_t *count, uint32_t *job_id) 153*91f16700Schasinglulu { 154*91f16700Schasinglulu uint32_t resp[5]; 155*91f16700Schasinglulu unsigned int resp_len = ARRAY_SIZE(resp); 156*91f16700Schasinglulu int status = INTEL_SIP_SMC_STATUS_OK; 157*91f16700Schasinglulu int all_completed = 1; 158*91f16700Schasinglulu *count = 0; 159*91f16700Schasinglulu 160*91f16700Schasinglulu while (*count < 3) { 161*91f16700Schasinglulu 162*91f16700Schasinglulu status = mailbox_read_response(job_id, 163*91f16700Schasinglulu resp, &resp_len); 164*91f16700Schasinglulu 165*91f16700Schasinglulu if (status < 0) { 166*91f16700Schasinglulu break; 167*91f16700Schasinglulu } 168*91f16700Schasinglulu 169*91f16700Schasinglulu max_blocks++; 170*91f16700Schasinglulu 171*91f16700Schasinglulu if (mark_last_buffer_xfer_completed( 172*91f16700Schasinglulu &completed_addr[*count]) == 0) { 173*91f16700Schasinglulu *count = *count + 1; 174*91f16700Schasinglulu } else { 175*91f16700Schasinglulu break; 176*91f16700Schasinglulu } 177*91f16700Schasinglulu } 178*91f16700Schasinglulu 179*91f16700Schasinglulu if (*count <= 0) { 180*91f16700Schasinglulu if (status != MBOX_NO_RESPONSE && 181*91f16700Schasinglulu status != MBOX_TIMEOUT && resp_len != 0) { 182*91f16700Schasinglulu mailbox_clear_response(); 183*91f16700Schasinglulu request_type = NO_REQUEST; 184*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 185*91f16700Schasinglulu } 186*91f16700Schasinglulu 187*91f16700Schasinglulu *count = 0; 188*91f16700Schasinglulu } 189*91f16700Schasinglulu 190*91f16700Schasinglulu intel_fpga_sdm_write_all(); 191*91f16700Schasinglulu 192*91f16700Schasinglulu if (*count > 0) { 193*91f16700Schasinglulu status = INTEL_SIP_SMC_STATUS_OK; 194*91f16700Schasinglulu } else if (*count == 0) { 195*91f16700Schasinglulu status = INTEL_SIP_SMC_STATUS_BUSY; 196*91f16700Schasinglulu } 197*91f16700Schasinglulu 198*91f16700Schasinglulu for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 199*91f16700Schasinglulu if (fpga_config_buffers[i].write_requested != 0) { 200*91f16700Schasinglulu all_completed = 0; 201*91f16700Schasinglulu break; 202*91f16700Schasinglulu } 203*91f16700Schasinglulu } 204*91f16700Schasinglulu 205*91f16700Schasinglulu if (all_completed == 1) { 206*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 207*91f16700Schasinglulu } 208*91f16700Schasinglulu 209*91f16700Schasinglulu return status; 210*91f16700Schasinglulu } 211*91f16700Schasinglulu 212*91f16700Schasinglulu static int intel_fpga_config_start(uint32_t flag) 213*91f16700Schasinglulu { 214*91f16700Schasinglulu uint32_t argument = 0x1; 215*91f16700Schasinglulu uint32_t response[3]; 216*91f16700Schasinglulu int status = 0; 217*91f16700Schasinglulu unsigned int size = 0; 218*91f16700Schasinglulu unsigned int resp_len = ARRAY_SIZE(response); 219*91f16700Schasinglulu 220*91f16700Schasinglulu request_type = RECONFIGURATION; 221*91f16700Schasinglulu 222*91f16700Schasinglulu if (!CONFIG_TEST_FLAG(flag, PARTIAL_CONFIG)) { 223*91f16700Schasinglulu bridge_disable = true; 224*91f16700Schasinglulu } 225*91f16700Schasinglulu 226*91f16700Schasinglulu if (CONFIG_TEST_FLAG(flag, AUTHENTICATION)) { 227*91f16700Schasinglulu size = 1; 228*91f16700Schasinglulu bridge_disable = false; 229*91f16700Schasinglulu request_type = BITSTREAM_AUTH; 230*91f16700Schasinglulu } 231*91f16700Schasinglulu 232*91f16700Schasinglulu mailbox_clear_response(); 233*91f16700Schasinglulu 234*91f16700Schasinglulu mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_CANCEL, NULL, 0U, 235*91f16700Schasinglulu CMD_CASUAL, NULL, NULL); 236*91f16700Schasinglulu 237*91f16700Schasinglulu status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_RECONFIG, &argument, size, 238*91f16700Schasinglulu CMD_CASUAL, response, &resp_len); 239*91f16700Schasinglulu 240*91f16700Schasinglulu if (status < 0) { 241*91f16700Schasinglulu bridge_disable = false; 242*91f16700Schasinglulu request_type = NO_REQUEST; 243*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 244*91f16700Schasinglulu } 245*91f16700Schasinglulu 246*91f16700Schasinglulu max_blocks = response[0]; 247*91f16700Schasinglulu bytes_per_block = response[1]; 248*91f16700Schasinglulu 249*91f16700Schasinglulu for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 250*91f16700Schasinglulu fpga_config_buffers[i].size = 0; 251*91f16700Schasinglulu fpga_config_buffers[i].size_written = 0; 252*91f16700Schasinglulu fpga_config_buffers[i].addr = 0; 253*91f16700Schasinglulu fpga_config_buffers[i].write_requested = 0; 254*91f16700Schasinglulu fpga_config_buffers[i].block_number = 0; 255*91f16700Schasinglulu fpga_config_buffers[i].subblocks_sent = 0; 256*91f16700Schasinglulu } 257*91f16700Schasinglulu 258*91f16700Schasinglulu blocks_submitted = 0; 259*91f16700Schasinglulu current_block = 0; 260*91f16700Schasinglulu read_block = 0; 261*91f16700Schasinglulu current_buffer = 0; 262*91f16700Schasinglulu 263*91f16700Schasinglulu /* Disable bridge on full reconfiguration */ 264*91f16700Schasinglulu if (bridge_disable) { 265*91f16700Schasinglulu socfpga_bridges_disable(~0); 266*91f16700Schasinglulu } 267*91f16700Schasinglulu 268*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 269*91f16700Schasinglulu } 270*91f16700Schasinglulu 271*91f16700Schasinglulu static bool is_fpga_config_buffer_full(void) 272*91f16700Schasinglulu { 273*91f16700Schasinglulu for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 274*91f16700Schasinglulu if (!fpga_config_buffers[i].write_requested) { 275*91f16700Schasinglulu return false; 276*91f16700Schasinglulu } 277*91f16700Schasinglulu } 278*91f16700Schasinglulu return true; 279*91f16700Schasinglulu } 280*91f16700Schasinglulu 281*91f16700Schasinglulu bool is_address_in_ddr_range(uint64_t addr, uint64_t size) 282*91f16700Schasinglulu { 283*91f16700Schasinglulu if (!addr && !size) { 284*91f16700Schasinglulu return true; 285*91f16700Schasinglulu } 286*91f16700Schasinglulu if (size > (UINT64_MAX - addr)) { 287*91f16700Schasinglulu return false; 288*91f16700Schasinglulu } 289*91f16700Schasinglulu if (addr < BL31_LIMIT) { 290*91f16700Schasinglulu return false; 291*91f16700Schasinglulu } 292*91f16700Schasinglulu if (addr + size > DRAM_BASE + DRAM_SIZE) { 293*91f16700Schasinglulu return false; 294*91f16700Schasinglulu } 295*91f16700Schasinglulu 296*91f16700Schasinglulu return true; 297*91f16700Schasinglulu } 298*91f16700Schasinglulu 299*91f16700Schasinglulu static uint32_t intel_fpga_config_write(uint64_t mem, uint64_t size) 300*91f16700Schasinglulu { 301*91f16700Schasinglulu int i; 302*91f16700Schasinglulu 303*91f16700Schasinglulu intel_fpga_sdm_write_all(); 304*91f16700Schasinglulu 305*91f16700Schasinglulu if (!is_address_in_ddr_range(mem, size) || 306*91f16700Schasinglulu is_fpga_config_buffer_full()) { 307*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_REJECTED; 308*91f16700Schasinglulu } 309*91f16700Schasinglulu 310*91f16700Schasinglulu for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 311*91f16700Schasinglulu int j = (i + current_buffer) % FPGA_CONFIG_BUFFER_SIZE; 312*91f16700Schasinglulu 313*91f16700Schasinglulu if (!fpga_config_buffers[j].write_requested) { 314*91f16700Schasinglulu fpga_config_buffers[j].addr = mem; 315*91f16700Schasinglulu fpga_config_buffers[j].size = size; 316*91f16700Schasinglulu fpga_config_buffers[j].size_written = 0; 317*91f16700Schasinglulu fpga_config_buffers[j].write_requested = 1; 318*91f16700Schasinglulu fpga_config_buffers[j].block_number = 319*91f16700Schasinglulu blocks_submitted++; 320*91f16700Schasinglulu fpga_config_buffers[j].subblocks_sent = 0; 321*91f16700Schasinglulu break; 322*91f16700Schasinglulu } 323*91f16700Schasinglulu } 324*91f16700Schasinglulu 325*91f16700Schasinglulu if (is_fpga_config_buffer_full()) { 326*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_BUSY; 327*91f16700Schasinglulu } 328*91f16700Schasinglulu 329*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 330*91f16700Schasinglulu } 331*91f16700Schasinglulu 332*91f16700Schasinglulu static int is_out_of_sec_range(uint64_t reg_addr) 333*91f16700Schasinglulu { 334*91f16700Schasinglulu #if DEBUG 335*91f16700Schasinglulu return 0; 336*91f16700Schasinglulu #endif 337*91f16700Schasinglulu 338*91f16700Schasinglulu #if PLATFORM_MODEL != PLAT_SOCFPGA_AGILEX5 339*91f16700Schasinglulu switch (reg_addr) { 340*91f16700Schasinglulu case(0xF8011100): /* ECCCTRL1 */ 341*91f16700Schasinglulu case(0xF8011104): /* ECCCTRL2 */ 342*91f16700Schasinglulu case(0xF8011110): /* ERRINTEN */ 343*91f16700Schasinglulu case(0xF8011114): /* ERRINTENS */ 344*91f16700Schasinglulu case(0xF8011118): /* ERRINTENR */ 345*91f16700Schasinglulu case(0xF801111C): /* INTMODE */ 346*91f16700Schasinglulu case(0xF8011120): /* INTSTAT */ 347*91f16700Schasinglulu case(0xF8011124): /* DIAGINTTEST */ 348*91f16700Schasinglulu case(0xF801112C): /* DERRADDRA */ 349*91f16700Schasinglulu case(0xFA000000): /* SMMU SCR0 */ 350*91f16700Schasinglulu case(0xFA000004): /* SMMU SCR1 */ 351*91f16700Schasinglulu case(0xFA000400): /* SMMU NSCR0 */ 352*91f16700Schasinglulu case(0xFA004000): /* SMMU SSD0_REG */ 353*91f16700Schasinglulu case(0xFA000820): /* SMMU SMR8 */ 354*91f16700Schasinglulu case(0xFA000c20): /* SMMU SCR8 */ 355*91f16700Schasinglulu case(0xFA028000): /* SMMU CB8_SCTRL */ 356*91f16700Schasinglulu case(0xFA001020): /* SMMU CBAR8 */ 357*91f16700Schasinglulu case(0xFA028030): /* SMMU TCR_LPAE */ 358*91f16700Schasinglulu case(0xFA028020): /* SMMU CB8_TTBR0_LOW */ 359*91f16700Schasinglulu case(0xFA028024): /* SMMU CB8_PRRR_HIGH */ 360*91f16700Schasinglulu case(0xFA028038): /* SMMU CB8_PRRR_MIR0 */ 361*91f16700Schasinglulu case(0xFA02803C): /* SMMU CB8_PRRR_MIR1 */ 362*91f16700Schasinglulu case(0xFA028010): /* SMMU_CB8)TCR2 */ 363*91f16700Schasinglulu case(0xFFD080A4): /* SDM SMMU STREAM ID REG */ 364*91f16700Schasinglulu case(0xFA001820): /* SMMU_CBA2R8 */ 365*91f16700Schasinglulu case(0xFA000074): /* SMMU_STLBGSTATUS */ 366*91f16700Schasinglulu case(0xFA0287F4): /* SMMU_CB8_TLBSTATUS */ 367*91f16700Schasinglulu case(0xFA000060): /* SMMU_STLBIALL */ 368*91f16700Schasinglulu case(0xFA000070): /* SMMU_STLBGSYNC */ 369*91f16700Schasinglulu case(0xFA028618): /* CB8_TLBALL */ 370*91f16700Schasinglulu case(0xFA0287F0): /* CB8_TLBSYNC */ 371*91f16700Schasinglulu case(0xFFD12028): /* SDMMCGRP_CTRL */ 372*91f16700Schasinglulu case(0xFFD12044): /* EMAC0 */ 373*91f16700Schasinglulu case(0xFFD12048): /* EMAC1 */ 374*91f16700Schasinglulu case(0xFFD1204C): /* EMAC2 */ 375*91f16700Schasinglulu case(0xFFD12090): /* ECC_INT_MASK_VALUE */ 376*91f16700Schasinglulu case(0xFFD12094): /* ECC_INT_MASK_SET */ 377*91f16700Schasinglulu case(0xFFD12098): /* ECC_INT_MASK_CLEAR */ 378*91f16700Schasinglulu case(0xFFD1209C): /* ECC_INTSTATUS_SERR */ 379*91f16700Schasinglulu case(0xFFD120A0): /* ECC_INTSTATUS_DERR */ 380*91f16700Schasinglulu case(0xFFD120C0): /* NOC_TIMEOUT */ 381*91f16700Schasinglulu case(0xFFD120C4): /* NOC_IDLEREQ_SET */ 382*91f16700Schasinglulu case(0xFFD120C8): /* NOC_IDLEREQ_CLR */ 383*91f16700Schasinglulu case(0xFFD120D0): /* NOC_IDLEACK */ 384*91f16700Schasinglulu case(0xFFD120D4): /* NOC_IDLESTATUS */ 385*91f16700Schasinglulu case(0xFFD12200): /* BOOT_SCRATCH_COLD0 */ 386*91f16700Schasinglulu case(0xFFD12204): /* BOOT_SCRATCH_COLD1 */ 387*91f16700Schasinglulu case(0xFFD12220): /* BOOT_SCRATCH_COLD8 */ 388*91f16700Schasinglulu case(0xFFD12224): /* BOOT_SCRATCH_COLD9 */ 389*91f16700Schasinglulu return 0; 390*91f16700Schasinglulu #else 391*91f16700Schasinglulu switch (reg_addr) { 392*91f16700Schasinglulu 393*91f16700Schasinglulu case(0xF8011104): /* ECCCTRL2 */ 394*91f16700Schasinglulu case(0xFFD12028): /* SDMMCGRP_CTRL */ 395*91f16700Schasinglulu case(0xFFD120C4): /* NOC_IDLEREQ_SET */ 396*91f16700Schasinglulu case(0xFFD120C8): /* NOC_IDLEREQ_CLR */ 397*91f16700Schasinglulu case(0xFFD120D0): /* NOC_IDLEACK */ 398*91f16700Schasinglulu 399*91f16700Schasinglulu 400*91f16700Schasinglulu case(SOCFPGA_MEMCTRL(ECCCTRL1)): /* ECCCTRL1 */ 401*91f16700Schasinglulu case(SOCFPGA_MEMCTRL(ERRINTEN)): /* ERRINTEN */ 402*91f16700Schasinglulu case(SOCFPGA_MEMCTRL(ERRINTENS)): /* ERRINTENS */ 403*91f16700Schasinglulu case(SOCFPGA_MEMCTRL(ERRINTENR)): /* ERRINTENR */ 404*91f16700Schasinglulu case(SOCFPGA_MEMCTRL(INTMODE)): /* INTMODE */ 405*91f16700Schasinglulu case(SOCFPGA_MEMCTRL(INTSTAT)): /* INTSTAT */ 406*91f16700Schasinglulu case(SOCFPGA_MEMCTRL(DIAGINTTEST)): /* DIAGINTTEST */ 407*91f16700Schasinglulu case(SOCFPGA_MEMCTRL(DERRADDRA)): /* DERRADDRA */ 408*91f16700Schasinglulu 409*91f16700Schasinglulu case(SOCFPGA_SYSMGR(EMAC_0)): /* EMAC0 */ 410*91f16700Schasinglulu case(SOCFPGA_SYSMGR(EMAC_1)): /* EMAC1 */ 411*91f16700Schasinglulu case(SOCFPGA_SYSMGR(EMAC_2)): /* EMAC2 */ 412*91f16700Schasinglulu case(SOCFPGA_SYSMGR(ECC_INTMASK_VALUE)): /* ECC_INT_MASK_VALUE */ 413*91f16700Schasinglulu case(SOCFPGA_SYSMGR(ECC_INTMASK_SET)): /* ECC_INT_MASK_SET */ 414*91f16700Schasinglulu case(SOCFPGA_SYSMGR(ECC_INTMASK_CLR)): /* ECC_INT_MASK_CLEAR */ 415*91f16700Schasinglulu case(SOCFPGA_SYSMGR(ECC_INTMASK_SERR)): /* ECC_INTSTATUS_SERR */ 416*91f16700Schasinglulu case(SOCFPGA_SYSMGR(ECC_INTMASK_DERR)): /* ECC_INTSTATUS_DERR */ 417*91f16700Schasinglulu case(SOCFPGA_SYSMGR(NOC_TIMEOUT)): /* NOC_TIMEOUT */ 418*91f16700Schasinglulu case(SOCFPGA_SYSMGR(NOC_IDLESTATUS)): /* NOC_IDLESTATUS */ 419*91f16700Schasinglulu case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_0)): /* BOOT_SCRATCH_COLD0 */ 420*91f16700Schasinglulu case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_1)): /* BOOT_SCRATCH_COLD1 */ 421*91f16700Schasinglulu case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_8)): /* BOOT_SCRATCH_COLD8 */ 422*91f16700Schasinglulu case(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_9)): /* BOOT_SCRATCH_COLD9 */ 423*91f16700Schasinglulu return 0; 424*91f16700Schasinglulu #endif 425*91f16700Schasinglulu default: 426*91f16700Schasinglulu break; 427*91f16700Schasinglulu } 428*91f16700Schasinglulu 429*91f16700Schasinglulu return -1; 430*91f16700Schasinglulu } 431*91f16700Schasinglulu 432*91f16700Schasinglulu /* Secure register access */ 433*91f16700Schasinglulu uint32_t intel_secure_reg_read(uint64_t reg_addr, uint32_t *retval) 434*91f16700Schasinglulu { 435*91f16700Schasinglulu if (is_out_of_sec_range(reg_addr)) { 436*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 437*91f16700Schasinglulu } 438*91f16700Schasinglulu 439*91f16700Schasinglulu *retval = mmio_read_32(reg_addr); 440*91f16700Schasinglulu 441*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 442*91f16700Schasinglulu } 443*91f16700Schasinglulu 444*91f16700Schasinglulu uint32_t intel_secure_reg_write(uint64_t reg_addr, uint32_t val, 445*91f16700Schasinglulu uint32_t *retval) 446*91f16700Schasinglulu { 447*91f16700Schasinglulu if (is_out_of_sec_range(reg_addr)) { 448*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 449*91f16700Schasinglulu } 450*91f16700Schasinglulu 451*91f16700Schasinglulu mmio_write_32(reg_addr, val); 452*91f16700Schasinglulu 453*91f16700Schasinglulu return intel_secure_reg_read(reg_addr, retval); 454*91f16700Schasinglulu } 455*91f16700Schasinglulu 456*91f16700Schasinglulu uint32_t intel_secure_reg_update(uint64_t reg_addr, uint32_t mask, 457*91f16700Schasinglulu uint32_t val, uint32_t *retval) 458*91f16700Schasinglulu { 459*91f16700Schasinglulu if (!intel_secure_reg_read(reg_addr, retval)) { 460*91f16700Schasinglulu *retval &= ~mask; 461*91f16700Schasinglulu *retval |= val & mask; 462*91f16700Schasinglulu return intel_secure_reg_write(reg_addr, *retval, retval); 463*91f16700Schasinglulu } 464*91f16700Schasinglulu 465*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 466*91f16700Schasinglulu } 467*91f16700Schasinglulu 468*91f16700Schasinglulu /* Intel Remote System Update (RSU) services */ 469*91f16700Schasinglulu uint64_t intel_rsu_update_address; 470*91f16700Schasinglulu 471*91f16700Schasinglulu static uint32_t intel_rsu_status(uint64_t *respbuf, unsigned int respbuf_sz) 472*91f16700Schasinglulu { 473*91f16700Schasinglulu if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 474*91f16700Schasinglulu return INTEL_SIP_SMC_RSU_ERROR; 475*91f16700Schasinglulu } 476*91f16700Schasinglulu 477*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 478*91f16700Schasinglulu } 479*91f16700Schasinglulu 480*91f16700Schasinglulu uint32_t intel_rsu_update(uint64_t update_address) 481*91f16700Schasinglulu { 482*91f16700Schasinglulu if (update_address > SIZE_MAX) { 483*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_REJECTED; 484*91f16700Schasinglulu } 485*91f16700Schasinglulu 486*91f16700Schasinglulu intel_rsu_update_address = update_address; 487*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 488*91f16700Schasinglulu } 489*91f16700Schasinglulu 490*91f16700Schasinglulu static uint32_t intel_rsu_notify(uint32_t execution_stage) 491*91f16700Schasinglulu { 492*91f16700Schasinglulu if (mailbox_hps_stage_notify(execution_stage) < 0) { 493*91f16700Schasinglulu return INTEL_SIP_SMC_RSU_ERROR; 494*91f16700Schasinglulu } 495*91f16700Schasinglulu 496*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 497*91f16700Schasinglulu } 498*91f16700Schasinglulu 499*91f16700Schasinglulu static uint32_t intel_rsu_retry_counter(uint32_t *respbuf, uint32_t respbuf_sz, 500*91f16700Schasinglulu uint32_t *ret_stat) 501*91f16700Schasinglulu { 502*91f16700Schasinglulu if (mailbox_rsu_status((uint32_t *)respbuf, respbuf_sz) < 0) { 503*91f16700Schasinglulu return INTEL_SIP_SMC_RSU_ERROR; 504*91f16700Schasinglulu } 505*91f16700Schasinglulu 506*91f16700Schasinglulu *ret_stat = respbuf[8]; 507*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 508*91f16700Schasinglulu } 509*91f16700Schasinglulu 510*91f16700Schasinglulu static uint32_t intel_rsu_copy_dcmf_version(uint64_t dcmf_ver_1_0, 511*91f16700Schasinglulu uint64_t dcmf_ver_3_2) 512*91f16700Schasinglulu { 513*91f16700Schasinglulu rsu_dcmf_ver[0] = dcmf_ver_1_0; 514*91f16700Schasinglulu rsu_dcmf_ver[1] = dcmf_ver_1_0 >> 32; 515*91f16700Schasinglulu rsu_dcmf_ver[2] = dcmf_ver_3_2; 516*91f16700Schasinglulu rsu_dcmf_ver[3] = dcmf_ver_3_2 >> 32; 517*91f16700Schasinglulu 518*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 519*91f16700Schasinglulu } 520*91f16700Schasinglulu 521*91f16700Schasinglulu static uint32_t intel_rsu_copy_dcmf_status(uint64_t dcmf_stat) 522*91f16700Schasinglulu { 523*91f16700Schasinglulu rsu_dcmf_stat[0] = 0xFFFF & (dcmf_stat >> (0 * 16)); 524*91f16700Schasinglulu rsu_dcmf_stat[1] = 0xFFFF & (dcmf_stat >> (1 * 16)); 525*91f16700Schasinglulu rsu_dcmf_stat[2] = 0xFFFF & (dcmf_stat >> (2 * 16)); 526*91f16700Schasinglulu rsu_dcmf_stat[3] = 0xFFFF & (dcmf_stat >> (3 * 16)); 527*91f16700Schasinglulu 528*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 529*91f16700Schasinglulu } 530*91f16700Schasinglulu 531*91f16700Schasinglulu /* Intel HWMON services */ 532*91f16700Schasinglulu static uint32_t intel_hwmon_readtemp(uint32_t chan, uint32_t *retval) 533*91f16700Schasinglulu { 534*91f16700Schasinglulu if (mailbox_hwmon_readtemp(chan, retval) < 0) { 535*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 536*91f16700Schasinglulu } 537*91f16700Schasinglulu 538*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 539*91f16700Schasinglulu } 540*91f16700Schasinglulu 541*91f16700Schasinglulu static uint32_t intel_hwmon_readvolt(uint32_t chan, uint32_t *retval) 542*91f16700Schasinglulu { 543*91f16700Schasinglulu if (mailbox_hwmon_readvolt(chan, retval) < 0) { 544*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 545*91f16700Schasinglulu } 546*91f16700Schasinglulu 547*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 548*91f16700Schasinglulu } 549*91f16700Schasinglulu 550*91f16700Schasinglulu /* Mailbox services */ 551*91f16700Schasinglulu static uint32_t intel_smc_fw_version(uint32_t *fw_version) 552*91f16700Schasinglulu { 553*91f16700Schasinglulu int status; 554*91f16700Schasinglulu unsigned int resp_len = CONFIG_STATUS_WORD_SIZE; 555*91f16700Schasinglulu uint32_t resp_data[CONFIG_STATUS_WORD_SIZE] = {0U}; 556*91f16700Schasinglulu 557*91f16700Schasinglulu status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CONFIG_STATUS, NULL, 0U, 558*91f16700Schasinglulu CMD_CASUAL, resp_data, &resp_len); 559*91f16700Schasinglulu 560*91f16700Schasinglulu if (status < 0) { 561*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 562*91f16700Schasinglulu } 563*91f16700Schasinglulu 564*91f16700Schasinglulu if (resp_len <= CONFIG_STATUS_FW_VER_OFFSET) { 565*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 566*91f16700Schasinglulu } 567*91f16700Schasinglulu 568*91f16700Schasinglulu *fw_version = resp_data[CONFIG_STATUS_FW_VER_OFFSET] & CONFIG_STATUS_FW_VER_MASK; 569*91f16700Schasinglulu 570*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 571*91f16700Schasinglulu } 572*91f16700Schasinglulu 573*91f16700Schasinglulu static uint32_t intel_mbox_send_cmd(uint32_t cmd, uint32_t *args, 574*91f16700Schasinglulu unsigned int len, uint32_t urgent, uint64_t response, 575*91f16700Schasinglulu unsigned int resp_len, int *mbox_status, 576*91f16700Schasinglulu unsigned int *len_in_resp) 577*91f16700Schasinglulu { 578*91f16700Schasinglulu *len_in_resp = 0; 579*91f16700Schasinglulu *mbox_status = GENERIC_RESPONSE_ERROR; 580*91f16700Schasinglulu 581*91f16700Schasinglulu if (!is_address_in_ddr_range((uint64_t)args, sizeof(uint32_t) * len)) { 582*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_REJECTED; 583*91f16700Schasinglulu } 584*91f16700Schasinglulu 585*91f16700Schasinglulu int status = mailbox_send_cmd(MBOX_JOB_ID, cmd, args, len, urgent, 586*91f16700Schasinglulu (uint32_t *) response, &resp_len); 587*91f16700Schasinglulu 588*91f16700Schasinglulu if (status < 0) { 589*91f16700Schasinglulu *mbox_status = -status; 590*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 591*91f16700Schasinglulu } 592*91f16700Schasinglulu 593*91f16700Schasinglulu *mbox_status = 0; 594*91f16700Schasinglulu *len_in_resp = resp_len; 595*91f16700Schasinglulu 596*91f16700Schasinglulu flush_dcache_range(response, resp_len * MBOX_WORD_BYTE); 597*91f16700Schasinglulu 598*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 599*91f16700Schasinglulu } 600*91f16700Schasinglulu 601*91f16700Schasinglulu static int intel_smc_get_usercode(uint32_t *user_code) 602*91f16700Schasinglulu { 603*91f16700Schasinglulu int status; 604*91f16700Schasinglulu unsigned int resp_len = sizeof(user_code) / MBOX_WORD_BYTE; 605*91f16700Schasinglulu 606*91f16700Schasinglulu status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CMD_GET_USERCODE, NULL, 607*91f16700Schasinglulu 0U, CMD_CASUAL, user_code, &resp_len); 608*91f16700Schasinglulu 609*91f16700Schasinglulu if (status < 0) { 610*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 611*91f16700Schasinglulu } 612*91f16700Schasinglulu 613*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 614*91f16700Schasinglulu } 615*91f16700Schasinglulu 616*91f16700Schasinglulu uint32_t intel_smc_service_completed(uint64_t addr, uint32_t size, 617*91f16700Schasinglulu uint32_t mode, uint32_t *job_id, 618*91f16700Schasinglulu uint32_t *ret_size, uint32_t *mbox_error) 619*91f16700Schasinglulu { 620*91f16700Schasinglulu int status = 0; 621*91f16700Schasinglulu uint32_t resp_len = size / MBOX_WORD_BYTE; 622*91f16700Schasinglulu 623*91f16700Schasinglulu if (resp_len > MBOX_DATA_MAX_LEN) { 624*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_REJECTED; 625*91f16700Schasinglulu } 626*91f16700Schasinglulu 627*91f16700Schasinglulu if (!is_address_in_ddr_range(addr, size)) { 628*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_REJECTED; 629*91f16700Schasinglulu } 630*91f16700Schasinglulu 631*91f16700Schasinglulu if (mode == SERVICE_COMPLETED_MODE_ASYNC) { 632*91f16700Schasinglulu status = mailbox_read_response_async(job_id, 633*91f16700Schasinglulu NULL, (uint32_t *) addr, &resp_len, 0); 634*91f16700Schasinglulu } else { 635*91f16700Schasinglulu status = mailbox_read_response(job_id, 636*91f16700Schasinglulu (uint32_t *) addr, &resp_len); 637*91f16700Schasinglulu 638*91f16700Schasinglulu if (status == MBOX_NO_RESPONSE) { 639*91f16700Schasinglulu status = MBOX_BUSY; 640*91f16700Schasinglulu } 641*91f16700Schasinglulu } 642*91f16700Schasinglulu 643*91f16700Schasinglulu if (status == MBOX_NO_RESPONSE) { 644*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_NO_RESPONSE; 645*91f16700Schasinglulu } 646*91f16700Schasinglulu 647*91f16700Schasinglulu if (status == MBOX_BUSY) { 648*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_BUSY; 649*91f16700Schasinglulu } 650*91f16700Schasinglulu 651*91f16700Schasinglulu *ret_size = resp_len * MBOX_WORD_BYTE; 652*91f16700Schasinglulu flush_dcache_range(addr, *ret_size); 653*91f16700Schasinglulu 654*91f16700Schasinglulu if (status == MBOX_RET_SDOS_DECRYPTION_ERROR_102 || 655*91f16700Schasinglulu status == MBOX_RET_SDOS_DECRYPTION_ERROR_103) { 656*91f16700Schasinglulu *mbox_error = -status; 657*91f16700Schasinglulu } else if (status != MBOX_RET_OK) { 658*91f16700Schasinglulu *mbox_error = -status; 659*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 660*91f16700Schasinglulu } 661*91f16700Schasinglulu 662*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 663*91f16700Schasinglulu } 664*91f16700Schasinglulu 665*91f16700Schasinglulu /* Miscellaneous HPS services */ 666*91f16700Schasinglulu uint32_t intel_hps_set_bridges(uint64_t enable, uint64_t mask) 667*91f16700Schasinglulu { 668*91f16700Schasinglulu int status = 0; 669*91f16700Schasinglulu 670*91f16700Schasinglulu if ((enable & SOCFPGA_BRIDGE_ENABLE) != 0U) { 671*91f16700Schasinglulu if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 672*91f16700Schasinglulu status = socfpga_bridges_enable((uint32_t)mask); 673*91f16700Schasinglulu } else { 674*91f16700Schasinglulu status = socfpga_bridges_enable(~0); 675*91f16700Schasinglulu } 676*91f16700Schasinglulu } else { 677*91f16700Schasinglulu if ((enable & SOCFPGA_BRIDGE_HAS_MASK) != 0U) { 678*91f16700Schasinglulu status = socfpga_bridges_disable((uint32_t)mask); 679*91f16700Schasinglulu } else { 680*91f16700Schasinglulu status = socfpga_bridges_disable(~0); 681*91f16700Schasinglulu } 682*91f16700Schasinglulu } 683*91f16700Schasinglulu 684*91f16700Schasinglulu if (status < 0) { 685*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_ERROR; 686*91f16700Schasinglulu } 687*91f16700Schasinglulu 688*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 689*91f16700Schasinglulu } 690*91f16700Schasinglulu 691*91f16700Schasinglulu /* SDM SEU Error services */ 692*91f16700Schasinglulu static uint32_t intel_sdm_seu_err_read(uint64_t *respbuf, unsigned int respbuf_sz) 693*91f16700Schasinglulu { 694*91f16700Schasinglulu if (mailbox_seu_err_status((uint32_t *)respbuf, respbuf_sz) < 0) { 695*91f16700Schasinglulu return INTEL_SIP_SMC_SEU_ERR_READ_ERROR; 696*91f16700Schasinglulu } 697*91f16700Schasinglulu 698*91f16700Schasinglulu return INTEL_SIP_SMC_STATUS_OK; 699*91f16700Schasinglulu } 700*91f16700Schasinglulu 701*91f16700Schasinglulu /* 702*91f16700Schasinglulu * This function is responsible for handling all SiP calls from the NS world 703*91f16700Schasinglulu */ 704*91f16700Schasinglulu 705*91f16700Schasinglulu uintptr_t sip_smc_handler_v1(uint32_t smc_fid, 706*91f16700Schasinglulu u_register_t x1, 707*91f16700Schasinglulu u_register_t x2, 708*91f16700Schasinglulu u_register_t x3, 709*91f16700Schasinglulu u_register_t x4, 710*91f16700Schasinglulu void *cookie, 711*91f16700Schasinglulu void *handle, 712*91f16700Schasinglulu u_register_t flags) 713*91f16700Schasinglulu { 714*91f16700Schasinglulu uint32_t retval = 0, completed_addr[3]; 715*91f16700Schasinglulu uint32_t retval2 = 0; 716*91f16700Schasinglulu uint32_t mbox_error = 0; 717*91f16700Schasinglulu uint64_t retval64, rsu_respbuf[9], seu_respbuf[3]; 718*91f16700Schasinglulu int status = INTEL_SIP_SMC_STATUS_OK; 719*91f16700Schasinglulu int mbox_status; 720*91f16700Schasinglulu unsigned int len_in_resp; 721*91f16700Schasinglulu u_register_t x5, x6, x7; 722*91f16700Schasinglulu 723*91f16700Schasinglulu switch (smc_fid) { 724*91f16700Schasinglulu case SIP_SVC_UID: 725*91f16700Schasinglulu /* Return UID to the caller */ 726*91f16700Schasinglulu SMC_UUID_RET(handle, intl_svc_uid); 727*91f16700Schasinglulu 728*91f16700Schasinglulu case INTEL_SIP_SMC_FPGA_CONFIG_ISDONE: 729*91f16700Schasinglulu status = intel_mailbox_fpga_config_isdone(); 730*91f16700Schasinglulu SMC_RET4(handle, status, 0, 0, 0); 731*91f16700Schasinglulu 732*91f16700Schasinglulu case INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM: 733*91f16700Schasinglulu SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 734*91f16700Schasinglulu INTEL_SIP_SMC_FPGA_CONFIG_ADDR, 735*91f16700Schasinglulu INTEL_SIP_SMC_FPGA_CONFIG_SIZE - 736*91f16700Schasinglulu INTEL_SIP_SMC_FPGA_CONFIG_ADDR); 737*91f16700Schasinglulu 738*91f16700Schasinglulu case INTEL_SIP_SMC_FPGA_CONFIG_START: 739*91f16700Schasinglulu status = intel_fpga_config_start(x1); 740*91f16700Schasinglulu SMC_RET4(handle, status, 0, 0, 0); 741*91f16700Schasinglulu 742*91f16700Schasinglulu case INTEL_SIP_SMC_FPGA_CONFIG_WRITE: 743*91f16700Schasinglulu status = intel_fpga_config_write(x1, x2); 744*91f16700Schasinglulu SMC_RET4(handle, status, 0, 0, 0); 745*91f16700Schasinglulu 746*91f16700Schasinglulu case INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE: 747*91f16700Schasinglulu status = intel_fpga_config_completed_write(completed_addr, 748*91f16700Schasinglulu &retval, &rcv_id); 749*91f16700Schasinglulu switch (retval) { 750*91f16700Schasinglulu case 1: 751*91f16700Schasinglulu SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 752*91f16700Schasinglulu completed_addr[0], 0, 0); 753*91f16700Schasinglulu 754*91f16700Schasinglulu case 2: 755*91f16700Schasinglulu SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 756*91f16700Schasinglulu completed_addr[0], 757*91f16700Schasinglulu completed_addr[1], 0); 758*91f16700Schasinglulu 759*91f16700Schasinglulu case 3: 760*91f16700Schasinglulu SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 761*91f16700Schasinglulu completed_addr[0], 762*91f16700Schasinglulu completed_addr[1], 763*91f16700Schasinglulu completed_addr[2]); 764*91f16700Schasinglulu 765*91f16700Schasinglulu case 0: 766*91f16700Schasinglulu SMC_RET4(handle, status, 0, 0, 0); 767*91f16700Schasinglulu 768*91f16700Schasinglulu default: 769*91f16700Schasinglulu mailbox_clear_response(); 770*91f16700Schasinglulu SMC_RET1(handle, INTEL_SIP_SMC_STATUS_ERROR); 771*91f16700Schasinglulu } 772*91f16700Schasinglulu 773*91f16700Schasinglulu case INTEL_SIP_SMC_REG_READ: 774*91f16700Schasinglulu status = intel_secure_reg_read(x1, &retval); 775*91f16700Schasinglulu SMC_RET3(handle, status, retval, x1); 776*91f16700Schasinglulu 777*91f16700Schasinglulu case INTEL_SIP_SMC_REG_WRITE: 778*91f16700Schasinglulu status = intel_secure_reg_write(x1, (uint32_t)x2, &retval); 779*91f16700Schasinglulu SMC_RET3(handle, status, retval, x1); 780*91f16700Schasinglulu 781*91f16700Schasinglulu case INTEL_SIP_SMC_REG_UPDATE: 782*91f16700Schasinglulu status = intel_secure_reg_update(x1, (uint32_t)x2, 783*91f16700Schasinglulu (uint32_t)x3, &retval); 784*91f16700Schasinglulu SMC_RET3(handle, status, retval, x1); 785*91f16700Schasinglulu 786*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_STATUS: 787*91f16700Schasinglulu status = intel_rsu_status(rsu_respbuf, 788*91f16700Schasinglulu ARRAY_SIZE(rsu_respbuf)); 789*91f16700Schasinglulu if (status) { 790*91f16700Schasinglulu SMC_RET1(handle, status); 791*91f16700Schasinglulu } else { 792*91f16700Schasinglulu SMC_RET4(handle, rsu_respbuf[0], rsu_respbuf[1], 793*91f16700Schasinglulu rsu_respbuf[2], rsu_respbuf[3]); 794*91f16700Schasinglulu } 795*91f16700Schasinglulu 796*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_UPDATE: 797*91f16700Schasinglulu status = intel_rsu_update(x1); 798*91f16700Schasinglulu SMC_RET1(handle, status); 799*91f16700Schasinglulu 800*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_NOTIFY: 801*91f16700Schasinglulu status = intel_rsu_notify(x1); 802*91f16700Schasinglulu SMC_RET1(handle, status); 803*91f16700Schasinglulu 804*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_RETRY_COUNTER: 805*91f16700Schasinglulu status = intel_rsu_retry_counter((uint32_t *)rsu_respbuf, 806*91f16700Schasinglulu ARRAY_SIZE(rsu_respbuf), &retval); 807*91f16700Schasinglulu if (status) { 808*91f16700Schasinglulu SMC_RET1(handle, status); 809*91f16700Schasinglulu } else { 810*91f16700Schasinglulu SMC_RET2(handle, status, retval); 811*91f16700Schasinglulu } 812*91f16700Schasinglulu 813*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_DCMF_VERSION: 814*91f16700Schasinglulu SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 815*91f16700Schasinglulu ((uint64_t)rsu_dcmf_ver[1] << 32) | rsu_dcmf_ver[0], 816*91f16700Schasinglulu ((uint64_t)rsu_dcmf_ver[3] << 32) | rsu_dcmf_ver[2]); 817*91f16700Schasinglulu 818*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_COPY_DCMF_VERSION: 819*91f16700Schasinglulu status = intel_rsu_copy_dcmf_version(x1, x2); 820*91f16700Schasinglulu SMC_RET1(handle, status); 821*91f16700Schasinglulu 822*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_DCMF_STATUS: 823*91f16700Schasinglulu SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, 824*91f16700Schasinglulu ((uint64_t)rsu_dcmf_stat[3] << 48) | 825*91f16700Schasinglulu ((uint64_t)rsu_dcmf_stat[2] << 32) | 826*91f16700Schasinglulu ((uint64_t)rsu_dcmf_stat[1] << 16) | 827*91f16700Schasinglulu rsu_dcmf_stat[0]); 828*91f16700Schasinglulu 829*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_COPY_DCMF_STATUS: 830*91f16700Schasinglulu status = intel_rsu_copy_dcmf_status(x1); 831*91f16700Schasinglulu SMC_RET1(handle, status); 832*91f16700Schasinglulu 833*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_MAX_RETRY: 834*91f16700Schasinglulu SMC_RET2(handle, INTEL_SIP_SMC_STATUS_OK, rsu_max_retry); 835*91f16700Schasinglulu 836*91f16700Schasinglulu case INTEL_SIP_SMC_RSU_COPY_MAX_RETRY: 837*91f16700Schasinglulu rsu_max_retry = x1; 838*91f16700Schasinglulu SMC_RET1(handle, INTEL_SIP_SMC_STATUS_OK); 839*91f16700Schasinglulu 840*91f16700Schasinglulu case INTEL_SIP_SMC_ECC_DBE: 841*91f16700Schasinglulu status = intel_ecc_dbe_notification(x1); 842*91f16700Schasinglulu SMC_RET1(handle, status); 843*91f16700Schasinglulu 844*91f16700Schasinglulu case INTEL_SIP_SMC_SERVICE_COMPLETED: 845*91f16700Schasinglulu status = intel_smc_service_completed(x1, x2, x3, &rcv_id, 846*91f16700Schasinglulu &len_in_resp, &mbox_error); 847*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x1, len_in_resp); 848*91f16700Schasinglulu 849*91f16700Schasinglulu case INTEL_SIP_SMC_FIRMWARE_VERSION: 850*91f16700Schasinglulu status = intel_smc_fw_version(&retval); 851*91f16700Schasinglulu SMC_RET2(handle, status, retval); 852*91f16700Schasinglulu 853*91f16700Schasinglulu case INTEL_SIP_SMC_MBOX_SEND_CMD: 854*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 855*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 856*91f16700Schasinglulu status = intel_mbox_send_cmd(x1, (uint32_t *)x2, x3, x4, x5, x6, 857*91f16700Schasinglulu &mbox_status, &len_in_resp); 858*91f16700Schasinglulu SMC_RET3(handle, status, mbox_status, len_in_resp); 859*91f16700Schasinglulu 860*91f16700Schasinglulu case INTEL_SIP_SMC_GET_USERCODE: 861*91f16700Schasinglulu status = intel_smc_get_usercode(&retval); 862*91f16700Schasinglulu SMC_RET2(handle, status, retval); 863*91f16700Schasinglulu 864*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_CRYPTION: 865*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 866*91f16700Schasinglulu 867*91f16700Schasinglulu if (x1 == FCS_MODE_DECRYPT) { 868*91f16700Schasinglulu status = intel_fcs_decryption(x2, x3, x4, x5, &send_id); 869*91f16700Schasinglulu } else if (x1 == FCS_MODE_ENCRYPT) { 870*91f16700Schasinglulu status = intel_fcs_encryption(x2, x3, x4, x5, &send_id); 871*91f16700Schasinglulu } else { 872*91f16700Schasinglulu status = INTEL_SIP_SMC_STATUS_REJECTED; 873*91f16700Schasinglulu } 874*91f16700Schasinglulu 875*91f16700Schasinglulu SMC_RET3(handle, status, x4, x5); 876*91f16700Schasinglulu 877*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_CRYPTION_EXT: 878*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 879*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 880*91f16700Schasinglulu x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 881*91f16700Schasinglulu 882*91f16700Schasinglulu if (x3 == FCS_MODE_DECRYPT) { 883*91f16700Schasinglulu status = intel_fcs_decryption_ext(x1, x2, x4, x5, x6, 884*91f16700Schasinglulu (uint32_t *) &x7, &mbox_error); 885*91f16700Schasinglulu } else if (x3 == FCS_MODE_ENCRYPT) { 886*91f16700Schasinglulu status = intel_fcs_encryption_ext(x1, x2, x4, x5, x6, 887*91f16700Schasinglulu (uint32_t *) &x7, &mbox_error); 888*91f16700Schasinglulu } else { 889*91f16700Schasinglulu status = INTEL_SIP_SMC_STATUS_REJECTED; 890*91f16700Schasinglulu } 891*91f16700Schasinglulu 892*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x6, x7); 893*91f16700Schasinglulu 894*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_RANDOM_NUMBER: 895*91f16700Schasinglulu status = intel_fcs_random_number_gen(x1, &retval64, 896*91f16700Schasinglulu &mbox_error); 897*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x1, retval64); 898*91f16700Schasinglulu 899*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_RANDOM_NUMBER_EXT: 900*91f16700Schasinglulu status = intel_fcs_random_number_gen_ext(x1, x2, x3, 901*91f16700Schasinglulu &send_id); 902*91f16700Schasinglulu SMC_RET1(handle, status); 903*91f16700Schasinglulu 904*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_SEND_CERTIFICATE: 905*91f16700Schasinglulu status = intel_fcs_send_cert(x1, x2, &send_id); 906*91f16700Schasinglulu SMC_RET1(handle, status); 907*91f16700Schasinglulu 908*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_GET_PROVISION_DATA: 909*91f16700Schasinglulu status = intel_fcs_get_provision_data(&send_id); 910*91f16700Schasinglulu SMC_RET1(handle, status); 911*91f16700Schasinglulu 912*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_CNTR_SET_PREAUTH: 913*91f16700Schasinglulu status = intel_fcs_cntr_set_preauth(x1, x2, x3, 914*91f16700Schasinglulu &mbox_error); 915*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 916*91f16700Schasinglulu 917*91f16700Schasinglulu case INTEL_SIP_SMC_HPS_SET_BRIDGES: 918*91f16700Schasinglulu status = intel_hps_set_bridges(x1, x2); 919*91f16700Schasinglulu SMC_RET1(handle, status); 920*91f16700Schasinglulu 921*91f16700Schasinglulu case INTEL_SIP_SMC_HWMON_READTEMP: 922*91f16700Schasinglulu status = intel_hwmon_readtemp(x1, &retval); 923*91f16700Schasinglulu SMC_RET2(handle, status, retval); 924*91f16700Schasinglulu 925*91f16700Schasinglulu case INTEL_SIP_SMC_HWMON_READVOLT: 926*91f16700Schasinglulu status = intel_hwmon_readvolt(x1, &retval); 927*91f16700Schasinglulu SMC_RET2(handle, status, retval); 928*91f16700Schasinglulu 929*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_PSGSIGMA_TEARDOWN: 930*91f16700Schasinglulu status = intel_fcs_sigma_teardown(x1, &mbox_error); 931*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 932*91f16700Schasinglulu 933*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_CHIP_ID: 934*91f16700Schasinglulu status = intel_fcs_chip_id(&retval, &retval2, &mbox_error); 935*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, retval, retval2); 936*91f16700Schasinglulu 937*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ATTESTATION_SUBKEY: 938*91f16700Schasinglulu status = intel_fcs_attestation_subkey(x1, x2, x3, 939*91f16700Schasinglulu (uint32_t *) &x4, &mbox_error); 940*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x3, x4); 941*91f16700Schasinglulu 942*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ATTESTATION_MEASUREMENTS: 943*91f16700Schasinglulu status = intel_fcs_get_measurement(x1, x2, x3, 944*91f16700Schasinglulu (uint32_t *) &x4, &mbox_error); 945*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x3, x4); 946*91f16700Schasinglulu 947*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_GET_ATTESTATION_CERT: 948*91f16700Schasinglulu status = intel_fcs_get_attestation_cert(x1, x2, 949*91f16700Schasinglulu (uint32_t *) &x3, &mbox_error); 950*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x2, x3); 951*91f16700Schasinglulu 952*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_CREATE_CERT_ON_RELOAD: 953*91f16700Schasinglulu status = intel_fcs_create_cert_on_reload(x1, &mbox_error); 954*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 955*91f16700Schasinglulu 956*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_OPEN_CS_SESSION: 957*91f16700Schasinglulu status = intel_fcs_open_crypto_service_session(&retval, &mbox_error); 958*91f16700Schasinglulu SMC_RET3(handle, status, mbox_error, retval); 959*91f16700Schasinglulu 960*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_CLOSE_CS_SESSION: 961*91f16700Schasinglulu status = intel_fcs_close_crypto_service_session(x1, &mbox_error); 962*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 963*91f16700Schasinglulu 964*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_IMPORT_CS_KEY: 965*91f16700Schasinglulu status = intel_fcs_import_crypto_service_key(x1, x2, &send_id); 966*91f16700Schasinglulu SMC_RET1(handle, status); 967*91f16700Schasinglulu 968*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_EXPORT_CS_KEY: 969*91f16700Schasinglulu status = intel_fcs_export_crypto_service_key(x1, x2, x3, 970*91f16700Schasinglulu (uint32_t *) &x4, &mbox_error); 971*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x3, x4); 972*91f16700Schasinglulu 973*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_REMOVE_CS_KEY: 974*91f16700Schasinglulu status = intel_fcs_remove_crypto_service_key(x1, x2, 975*91f16700Schasinglulu &mbox_error); 976*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 977*91f16700Schasinglulu 978*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_GET_CS_KEY_INFO: 979*91f16700Schasinglulu status = intel_fcs_get_crypto_service_key_info(x1, x2, x3, 980*91f16700Schasinglulu (uint32_t *) &x4, &mbox_error); 981*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x3, x4); 982*91f16700Schasinglulu 983*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_GET_DIGEST_INIT: 984*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 985*91f16700Schasinglulu status = intel_fcs_get_digest_init(x1, x2, x3, 986*91f16700Schasinglulu x4, x5, &mbox_error); 987*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 988*91f16700Schasinglulu 989*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_GET_DIGEST_UPDATE: 990*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 991*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 992*91f16700Schasinglulu status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 993*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, false, 994*91f16700Schasinglulu &mbox_error); 995*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 996*91f16700Schasinglulu 997*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_GET_DIGEST_FINALIZE: 998*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 999*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1000*91f16700Schasinglulu status = intel_fcs_get_digest_update_finalize(x1, x2, x3, 1001*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, true, 1002*91f16700Schasinglulu &mbox_error); 1003*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1004*91f16700Schasinglulu 1005*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_UPDATE: 1006*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1007*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1008*91f16700Schasinglulu status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 1009*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, false, 1010*91f16700Schasinglulu &mbox_error, &send_id); 1011*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1012*91f16700Schasinglulu 1013*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_FINALIZE: 1014*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1015*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1016*91f16700Schasinglulu status = intel_fcs_get_digest_smmu_update_finalize(x1, x2, x3, 1017*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, true, 1018*91f16700Schasinglulu &mbox_error, &send_id); 1019*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1020*91f16700Schasinglulu 1021*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_MAC_VERIFY_INIT: 1022*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1023*91f16700Schasinglulu status = intel_fcs_mac_verify_init(x1, x2, x3, 1024*91f16700Schasinglulu x4, x5, &mbox_error); 1025*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 1026*91f16700Schasinglulu 1027*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_MAC_VERIFY_UPDATE: 1028*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1029*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1030*91f16700Schasinglulu x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 1031*91f16700Schasinglulu status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 1032*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, x7, 1033*91f16700Schasinglulu false, &mbox_error); 1034*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1035*91f16700Schasinglulu 1036*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_MAC_VERIFY_FINALIZE: 1037*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1038*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1039*91f16700Schasinglulu x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 1040*91f16700Schasinglulu status = intel_fcs_mac_verify_update_finalize(x1, x2, x3, 1041*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, x7, 1042*91f16700Schasinglulu true, &mbox_error); 1043*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1044*91f16700Schasinglulu 1045*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_UPDATE: 1046*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1047*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1048*91f16700Schasinglulu x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 1049*91f16700Schasinglulu status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 1050*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, x7, 1051*91f16700Schasinglulu false, &mbox_error, &send_id); 1052*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1053*91f16700Schasinglulu 1054*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_FINALIZE: 1055*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1056*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1057*91f16700Schasinglulu x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 1058*91f16700Schasinglulu status = intel_fcs_mac_verify_smmu_update_finalize(x1, x2, x3, 1059*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, x7, 1060*91f16700Schasinglulu true, &mbox_error, &send_id); 1061*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1062*91f16700Schasinglulu 1063*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_INIT: 1064*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1065*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sign_init(x1, x2, x3, 1066*91f16700Schasinglulu x4, x5, &mbox_error); 1067*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 1068*91f16700Schasinglulu 1069*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_UPDATE: 1070*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1071*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1072*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 1073*91f16700Schasinglulu x3, x4, x5, (uint32_t *) &x6, false, 1074*91f16700Schasinglulu &mbox_error); 1075*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1076*91f16700Schasinglulu 1077*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_FINALIZE: 1078*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1079*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1080*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sign_update_finalize(x1, x2, 1081*91f16700Schasinglulu x3, x4, x5, (uint32_t *) &x6, true, 1082*91f16700Schasinglulu &mbox_error); 1083*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1084*91f16700Schasinglulu 1085*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_UPDATE: 1086*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1087*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1088*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 1089*91f16700Schasinglulu x2, x3, x4, x5, (uint32_t *) &x6, false, 1090*91f16700Schasinglulu &mbox_error, &send_id); 1091*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1092*91f16700Schasinglulu 1093*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGN_SMMU_FINALIZE: 1094*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1095*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1096*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sign_smmu_update_finalize(x1, 1097*91f16700Schasinglulu x2, x3, x4, x5, (uint32_t *) &x6, true, 1098*91f16700Schasinglulu &mbox_error, &send_id); 1099*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1100*91f16700Schasinglulu 1101*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_INIT: 1102*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1103*91f16700Schasinglulu status = intel_fcs_ecdsa_hash_sign_init(x1, x2, x3, 1104*91f16700Schasinglulu x4, x5, &mbox_error); 1105*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 1106*91f16700Schasinglulu 1107*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGN_FINALIZE: 1108*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1109*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1110*91f16700Schasinglulu status = intel_fcs_ecdsa_hash_sign_finalize(x1, x2, x3, 1111*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, &mbox_error); 1112*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1113*91f16700Schasinglulu 1114*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_INIT: 1115*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1116*91f16700Schasinglulu status = intel_fcs_ecdsa_hash_sig_verify_init(x1, x2, x3, 1117*91f16700Schasinglulu x4, x5, &mbox_error); 1118*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 1119*91f16700Schasinglulu 1120*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_HASH_SIG_VERIFY_FINALIZE: 1121*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1122*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1123*91f16700Schasinglulu status = intel_fcs_ecdsa_hash_sig_verify_finalize(x1, x2, x3, 1124*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, &mbox_error); 1125*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1126*91f16700Schasinglulu 1127*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_INIT: 1128*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1129*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sig_verify_init(x1, x2, x3, 1130*91f16700Schasinglulu x4, x5, &mbox_error); 1131*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 1132*91f16700Schasinglulu 1133*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_UPDATE: 1134*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1135*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1136*91f16700Schasinglulu x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 1137*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 1138*91f16700Schasinglulu x1, x2, x3, x4, x5, (uint32_t *) &x6, 1139*91f16700Schasinglulu x7, false, &mbox_error); 1140*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1141*91f16700Schasinglulu 1142*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_UPDATE: 1143*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1144*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1145*91f16700Schasinglulu x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 1146*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 1147*91f16700Schasinglulu x1, x2, x3, x4, x5, (uint32_t *) &x6, 1148*91f16700Schasinglulu x7, false, &mbox_error, &send_id); 1149*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1150*91f16700Schasinglulu 1151*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_SMMU_FINALIZE: 1152*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1153*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1154*91f16700Schasinglulu x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 1155*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sig_verify_smmu_update_finalize( 1156*91f16700Schasinglulu x1, x2, x3, x4, x5, (uint32_t *) &x6, 1157*91f16700Schasinglulu x7, true, &mbox_error, &send_id); 1158*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1159*91f16700Schasinglulu 1160*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIG_VERIFY_FINALIZE: 1161*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1162*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1163*91f16700Schasinglulu x7 = SMC_GET_GP(handle, CTX_GPREG_X7); 1164*91f16700Schasinglulu status = intel_fcs_ecdsa_sha2_data_sig_verify_update_finalize( 1165*91f16700Schasinglulu x1, x2, x3, x4, x5, (uint32_t *) &x6, 1166*91f16700Schasinglulu x7, true, &mbox_error); 1167*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1168*91f16700Schasinglulu 1169*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_INIT: 1170*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1171*91f16700Schasinglulu status = intel_fcs_ecdsa_get_pubkey_init(x1, x2, x3, 1172*91f16700Schasinglulu x4, x5, &mbox_error); 1173*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 1174*91f16700Schasinglulu 1175*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDSA_GET_PUBKEY_FINALIZE: 1176*91f16700Schasinglulu status = intel_fcs_ecdsa_get_pubkey_finalize(x1, x2, x3, 1177*91f16700Schasinglulu (uint32_t *) &x4, &mbox_error); 1178*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x3, x4); 1179*91f16700Schasinglulu 1180*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDH_REQUEST_INIT: 1181*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1182*91f16700Schasinglulu status = intel_fcs_ecdh_request_init(x1, x2, x3, 1183*91f16700Schasinglulu x4, x5, &mbox_error); 1184*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 1185*91f16700Schasinglulu 1186*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_ECDH_REQUEST_FINALIZE: 1187*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1188*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1189*91f16700Schasinglulu status = intel_fcs_ecdh_request_finalize(x1, x2, x3, 1190*91f16700Schasinglulu x4, x5, (uint32_t *) &x6, &mbox_error); 1191*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x5, x6); 1192*91f16700Schasinglulu 1193*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_AES_CRYPT_INIT: 1194*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1195*91f16700Schasinglulu status = intel_fcs_aes_crypt_init(x1, x2, x3, x4, x5, 1196*91f16700Schasinglulu &mbox_error); 1197*91f16700Schasinglulu SMC_RET2(handle, status, mbox_error); 1198*91f16700Schasinglulu 1199*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_AES_CRYPT_UPDATE: 1200*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1201*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1202*91f16700Schasinglulu status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1203*91f16700Schasinglulu x5, x6, false, &send_id); 1204*91f16700Schasinglulu SMC_RET1(handle, status); 1205*91f16700Schasinglulu 1206*91f16700Schasinglulu case INTEL_SIP_SMC_FCS_AES_CRYPT_FINALIZE: 1207*91f16700Schasinglulu x5 = SMC_GET_GP(handle, CTX_GPREG_X5); 1208*91f16700Schasinglulu x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 1209*91f16700Schasinglulu status = intel_fcs_aes_crypt_update_finalize(x1, x2, x3, x4, 1210*91f16700Schasinglulu x5, x6, true, &send_id); 1211*91f16700Schasinglulu SMC_RET1(handle, status); 1212*91f16700Schasinglulu 1213*91f16700Schasinglulu case INTEL_SIP_SMC_GET_ROM_PATCH_SHA384: 1214*91f16700Schasinglulu status = intel_fcs_get_rom_patch_sha384(x1, &retval64, 1215*91f16700Schasinglulu &mbox_error); 1216*91f16700Schasinglulu SMC_RET4(handle, status, mbox_error, x1, retval64); 1217*91f16700Schasinglulu 1218*91f16700Schasinglulu case INTEL_SIP_SMC_SVC_VERSION: 1219*91f16700Schasinglulu SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 1220*91f16700Schasinglulu SIP_SVC_VERSION_MAJOR, 1221*91f16700Schasinglulu SIP_SVC_VERSION_MINOR); 1222*91f16700Schasinglulu 1223*91f16700Schasinglulu case INTEL_SIP_SMC_SEU_ERR_STATUS: 1224*91f16700Schasinglulu status = intel_sdm_seu_err_read(seu_respbuf, 1225*91f16700Schasinglulu ARRAY_SIZE(seu_respbuf)); 1226*91f16700Schasinglulu if (status) { 1227*91f16700Schasinglulu SMC_RET1(handle, status); 1228*91f16700Schasinglulu } else { 1229*91f16700Schasinglulu SMC_RET3(handle, seu_respbuf[0], seu_respbuf[1], seu_respbuf[2]); 1230*91f16700Schasinglulu } 1231*91f16700Schasinglulu 1232*91f16700Schasinglulu default: 1233*91f16700Schasinglulu return socfpga_sip_handler(smc_fid, x1, x2, x3, x4, 1234*91f16700Schasinglulu cookie, handle, flags); 1235*91f16700Schasinglulu } 1236*91f16700Schasinglulu } 1237*91f16700Schasinglulu 1238*91f16700Schasinglulu uintptr_t sip_smc_handler(uint32_t smc_fid, 1239*91f16700Schasinglulu u_register_t x1, 1240*91f16700Schasinglulu u_register_t x2, 1241*91f16700Schasinglulu u_register_t x3, 1242*91f16700Schasinglulu u_register_t x4, 1243*91f16700Schasinglulu void *cookie, 1244*91f16700Schasinglulu void *handle, 1245*91f16700Schasinglulu u_register_t flags) 1246*91f16700Schasinglulu { 1247*91f16700Schasinglulu uint32_t cmd = smc_fid & INTEL_SIP_SMC_CMD_MASK; 1248*91f16700Schasinglulu 1249*91f16700Schasinglulu if (cmd >= INTEL_SIP_SMC_CMD_V2_RANGE_BEGIN && 1250*91f16700Schasinglulu cmd <= INTEL_SIP_SMC_CMD_V2_RANGE_END) { 1251*91f16700Schasinglulu return sip_smc_handler_v2(smc_fid, x1, x2, x3, x4, 1252*91f16700Schasinglulu cookie, handle, flags); 1253*91f16700Schasinglulu } else { 1254*91f16700Schasinglulu return sip_smc_handler_v1(smc_fid, x1, x2, x3, x4, 1255*91f16700Schasinglulu cookie, handle, flags); 1256*91f16700Schasinglulu } 1257*91f16700Schasinglulu } 1258*91f16700Schasinglulu 1259*91f16700Schasinglulu DECLARE_RT_SVC( 1260*91f16700Schasinglulu socfpga_sip_svc, 1261*91f16700Schasinglulu OEN_SIP_START, 1262*91f16700Schasinglulu OEN_SIP_END, 1263*91f16700Schasinglulu SMC_TYPE_FAST, 1264*91f16700Schasinglulu NULL, 1265*91f16700Schasinglulu sip_smc_handler 1266*91f16700Schasinglulu ); 1267*91f16700Schasinglulu 1268*91f16700Schasinglulu DECLARE_RT_SVC( 1269*91f16700Schasinglulu socfpga_sip_svc_std, 1270*91f16700Schasinglulu OEN_SIP_START, 1271*91f16700Schasinglulu OEN_SIP_END, 1272*91f16700Schasinglulu SMC_TYPE_YIELD, 1273*91f16700Schasinglulu NULL, 1274*91f16700Schasinglulu sip_smc_handler 1275*91f16700Schasinglulu ); 1276