1*c76d4239SHadi Asyrafi /* 2*c76d4239SHadi Asyrafi * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. 3*c76d4239SHadi Asyrafi * 4*c76d4239SHadi Asyrafi * SPDX-License-Identifier: BSD-3-Clause 5*c76d4239SHadi Asyrafi */ 6*c76d4239SHadi Asyrafi 7*c76d4239SHadi Asyrafi #include <assert.h> 8*c76d4239SHadi Asyrafi #include <common/debug.h> 9*c76d4239SHadi Asyrafi #include <common/runtime_svc.h> 10*c76d4239SHadi Asyrafi #include <tools_share/uuid.h> 11*c76d4239SHadi Asyrafi 12*c76d4239SHadi Asyrafi #include "socfpga_mailbox.h" 13*c76d4239SHadi Asyrafi 14*c76d4239SHadi Asyrafi /* Number of SiP Calls implemented */ 15*c76d4239SHadi Asyrafi #define SIP_NUM_CALLS 0x3 16*c76d4239SHadi Asyrafi 17*c76d4239SHadi Asyrafi /* Total buffer the driver can hold */ 18*c76d4239SHadi Asyrafi #define FPGA_CONFIG_BUFFER_SIZE 4 19*c76d4239SHadi Asyrafi 20*c76d4239SHadi Asyrafi int current_block; 21*c76d4239SHadi Asyrafi int current_buffer; 22*c76d4239SHadi Asyrafi int current_id = 1; 23*c76d4239SHadi Asyrafi int max_blocks; 24*c76d4239SHadi Asyrafi uint32_t bytes_per_block; 25*c76d4239SHadi Asyrafi uint32_t blocks_submitted; 26*c76d4239SHadi Asyrafi uint32_t blocks_completed; 27*c76d4239SHadi Asyrafi 28*c76d4239SHadi Asyrafi struct fpga_config_info { 29*c76d4239SHadi Asyrafi uint32_t addr; 30*c76d4239SHadi Asyrafi int size; 31*c76d4239SHadi Asyrafi int size_written; 32*c76d4239SHadi Asyrafi uint32_t write_requested; 33*c76d4239SHadi Asyrafi int subblocks_sent; 34*c76d4239SHadi Asyrafi int block_number; 35*c76d4239SHadi Asyrafi }; 36*c76d4239SHadi Asyrafi 37*c76d4239SHadi Asyrafi /* SiP Service UUID */ 38*c76d4239SHadi Asyrafi DEFINE_SVC_UUID2(intl_svc_uid, 39*c76d4239SHadi Asyrafi 0xa85273b0, 0xe85a, 0x4862, 0xa6, 0x2a, 40*c76d4239SHadi Asyrafi 0xfa, 0x88, 0x88, 0x17, 0x68, 0x81); 41*c76d4239SHadi Asyrafi 42*c76d4239SHadi Asyrafi uint64_t socfpga_sip_handler(uint32_t smc_fid, 43*c76d4239SHadi Asyrafi uint64_t x1, 44*c76d4239SHadi Asyrafi uint64_t x2, 45*c76d4239SHadi Asyrafi uint64_t x3, 46*c76d4239SHadi Asyrafi uint64_t x4, 47*c76d4239SHadi Asyrafi void *cookie, 48*c76d4239SHadi Asyrafi void *handle, 49*c76d4239SHadi Asyrafi uint64_t flags) 50*c76d4239SHadi Asyrafi { 51*c76d4239SHadi Asyrafi ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); 52*c76d4239SHadi Asyrafi SMC_RET1(handle, SMC_UNK); 53*c76d4239SHadi Asyrafi } 54*c76d4239SHadi Asyrafi 55*c76d4239SHadi Asyrafi struct fpga_config_info fpga_config_buffers[FPGA_CONFIG_BUFFER_SIZE]; 56*c76d4239SHadi Asyrafi 57*c76d4239SHadi Asyrafi static void intel_fpga_sdm_write_buffer(struct fpga_config_info *buffer) 58*c76d4239SHadi Asyrafi { 59*c76d4239SHadi Asyrafi uint32_t args[3]; 60*c76d4239SHadi Asyrafi 61*c76d4239SHadi Asyrafi while (max_blocks > 0 && buffer->size > buffer->size_written) { 62*c76d4239SHadi Asyrafi if (buffer->size - buffer->size_written <= 63*c76d4239SHadi Asyrafi bytes_per_block) { 64*c76d4239SHadi Asyrafi args[0] = (1<<8); 65*c76d4239SHadi Asyrafi args[1] = buffer->addr + buffer->size_written; 66*c76d4239SHadi Asyrafi args[2] = buffer->size - buffer->size_written; 67*c76d4239SHadi Asyrafi buffer->size_written += 68*c76d4239SHadi Asyrafi buffer->size - buffer->size_written; 69*c76d4239SHadi Asyrafi buffer->subblocks_sent++; 70*c76d4239SHadi Asyrafi mailbox_send_cmd_async(0x4, 71*c76d4239SHadi Asyrafi MBOX_RECONFIG_DATA, 72*c76d4239SHadi Asyrafi args, 3, 0); 73*c76d4239SHadi Asyrafi current_buffer++; 74*c76d4239SHadi Asyrafi current_buffer %= FPGA_CONFIG_BUFFER_SIZE; 75*c76d4239SHadi Asyrafi } else { 76*c76d4239SHadi Asyrafi args[0] = (1<<8); 77*c76d4239SHadi Asyrafi args[1] = buffer->addr + buffer->size_written; 78*c76d4239SHadi Asyrafi args[2] = bytes_per_block; 79*c76d4239SHadi Asyrafi buffer->size_written += bytes_per_block; 80*c76d4239SHadi Asyrafi mailbox_send_cmd_async(0x4, 81*c76d4239SHadi Asyrafi MBOX_RECONFIG_DATA, 82*c76d4239SHadi Asyrafi args, 3, 0); 83*c76d4239SHadi Asyrafi buffer->subblocks_sent++; 84*c76d4239SHadi Asyrafi } 85*c76d4239SHadi Asyrafi max_blocks--; 86*c76d4239SHadi Asyrafi } 87*c76d4239SHadi Asyrafi } 88*c76d4239SHadi Asyrafi 89*c76d4239SHadi Asyrafi static int intel_fpga_sdm_write_all(void) 90*c76d4239SHadi Asyrafi { 91*c76d4239SHadi Asyrafi int i; 92*c76d4239SHadi Asyrafi 93*c76d4239SHadi Asyrafi for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) 94*c76d4239SHadi Asyrafi intel_fpga_sdm_write_buffer( 95*c76d4239SHadi Asyrafi &fpga_config_buffers[current_buffer]); 96*c76d4239SHadi Asyrafi 97*c76d4239SHadi Asyrafi return 0; 98*c76d4239SHadi Asyrafi } 99*c76d4239SHadi Asyrafi 100*c76d4239SHadi Asyrafi uint32_t intel_mailbox_fpga_config_isdone(void) 101*c76d4239SHadi Asyrafi { 102*c76d4239SHadi Asyrafi uint32_t args[2]; 103*c76d4239SHadi Asyrafi uint32_t response[6]; 104*c76d4239SHadi Asyrafi int status; 105*c76d4239SHadi Asyrafi 106*c76d4239SHadi Asyrafi status = mailbox_send_cmd(1, MBOX_RECONFIG_STATUS, args, 0, 0, 107*c76d4239SHadi Asyrafi response); 108*c76d4239SHadi Asyrafi 109*c76d4239SHadi Asyrafi if (status < 0) 110*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 111*c76d4239SHadi Asyrafi 112*c76d4239SHadi Asyrafi if (response[RECONFIG_STATUS_STATE] && 113*c76d4239SHadi Asyrafi response[RECONFIG_STATUS_STATE] != MBOX_CFGSTAT_STATE_CONFIG) 114*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 115*c76d4239SHadi Asyrafi 116*c76d4239SHadi Asyrafi if (!(response[RECONFIG_STATUS_PIN_STATUS] & PIN_STATUS_NSTATUS)) 117*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 118*c76d4239SHadi Asyrafi 119*c76d4239SHadi Asyrafi if (response[RECONFIG_STATUS_SOFTFUNC_STATUS] & 120*c76d4239SHadi Asyrafi SOFTFUNC_STATUS_SEU_ERROR) 121*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 122*c76d4239SHadi Asyrafi 123*c76d4239SHadi Asyrafi if ((response[RECONFIG_STATUS_SOFTFUNC_STATUS] & 124*c76d4239SHadi Asyrafi SOFTFUNC_STATUS_CONF_DONE) && 125*c76d4239SHadi Asyrafi (response[RECONFIG_STATUS_SOFTFUNC_STATUS] & 126*c76d4239SHadi Asyrafi SOFTFUNC_STATUS_INIT_DONE)) 127*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 128*c76d4239SHadi Asyrafi 129*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 130*c76d4239SHadi Asyrafi } 131*c76d4239SHadi Asyrafi 132*c76d4239SHadi Asyrafi static int mark_last_buffer_xfer_completed(uint32_t *buffer_addr_completed) 133*c76d4239SHadi Asyrafi { 134*c76d4239SHadi Asyrafi int i; 135*c76d4239SHadi Asyrafi 136*c76d4239SHadi Asyrafi for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 137*c76d4239SHadi Asyrafi if (fpga_config_buffers[i].block_number == current_block) { 138*c76d4239SHadi Asyrafi fpga_config_buffers[i].subblocks_sent--; 139*c76d4239SHadi Asyrafi if (fpga_config_buffers[i].subblocks_sent == 0 140*c76d4239SHadi Asyrafi && fpga_config_buffers[i].size <= 141*c76d4239SHadi Asyrafi fpga_config_buffers[i].size_written) { 142*c76d4239SHadi Asyrafi fpga_config_buffers[i].write_requested = 0; 143*c76d4239SHadi Asyrafi current_block++; 144*c76d4239SHadi Asyrafi *buffer_addr_completed = 145*c76d4239SHadi Asyrafi fpga_config_buffers[i].addr; 146*c76d4239SHadi Asyrafi return 0; 147*c76d4239SHadi Asyrafi } 148*c76d4239SHadi Asyrafi } 149*c76d4239SHadi Asyrafi } 150*c76d4239SHadi Asyrafi 151*c76d4239SHadi Asyrafi return -1; 152*c76d4239SHadi Asyrafi } 153*c76d4239SHadi Asyrafi 154*c76d4239SHadi Asyrafi unsigned int address_in_ddr(uint32_t *addr) 155*c76d4239SHadi Asyrafi { 156*c76d4239SHadi Asyrafi if (((unsigned long long)addr > DRAM_BASE) && 157*c76d4239SHadi Asyrafi ((unsigned long long)addr < DRAM_BASE + DRAM_SIZE)) 158*c76d4239SHadi Asyrafi return 0; 159*c76d4239SHadi Asyrafi 160*c76d4239SHadi Asyrafi return -1; 161*c76d4239SHadi Asyrafi } 162*c76d4239SHadi Asyrafi 163*c76d4239SHadi Asyrafi int intel_fpga_config_completed_write(uint32_t *completed_addr, 164*c76d4239SHadi Asyrafi uint32_t *count) 165*c76d4239SHadi Asyrafi { 166*c76d4239SHadi Asyrafi uint32_t status = INTEL_SIP_SMC_STATUS_OK; 167*c76d4239SHadi Asyrafi *count = 0; 168*c76d4239SHadi Asyrafi int resp_len = 0; 169*c76d4239SHadi Asyrafi uint32_t resp[5]; 170*c76d4239SHadi Asyrafi int all_completed = 1; 171*c76d4239SHadi Asyrafi int count_check = 0; 172*c76d4239SHadi Asyrafi 173*c76d4239SHadi Asyrafi if (address_in_ddr(completed_addr) != 0 || address_in_ddr(count) != 0) 174*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 175*c76d4239SHadi Asyrafi 176*c76d4239SHadi Asyrafi for (count_check = 0; count_check < 3; count_check++) 177*c76d4239SHadi Asyrafi if (address_in_ddr(&completed_addr[*count + count_check]) != 0) 178*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 179*c76d4239SHadi Asyrafi 180*c76d4239SHadi Asyrafi resp_len = mailbox_read_response(0x4, resp); 181*c76d4239SHadi Asyrafi 182*c76d4239SHadi Asyrafi while (resp_len >= 0 && *count < 3) { 183*c76d4239SHadi Asyrafi max_blocks++; 184*c76d4239SHadi Asyrafi if (mark_last_buffer_xfer_completed( 185*c76d4239SHadi Asyrafi &completed_addr[*count]) == 0) 186*c76d4239SHadi Asyrafi *count = *count + 1; 187*c76d4239SHadi Asyrafi else 188*c76d4239SHadi Asyrafi break; 189*c76d4239SHadi Asyrafi resp_len = mailbox_read_response(0x4, resp); 190*c76d4239SHadi Asyrafi } 191*c76d4239SHadi Asyrafi 192*c76d4239SHadi Asyrafi if (*count <= 0) { 193*c76d4239SHadi Asyrafi if (resp_len != MBOX_NO_RESPONSE && 194*c76d4239SHadi Asyrafi resp_len != MBOX_TIMEOUT && resp_len != 0) { 195*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_ERROR; 196*c76d4239SHadi Asyrafi } 197*c76d4239SHadi Asyrafi 198*c76d4239SHadi Asyrafi *count = 0; 199*c76d4239SHadi Asyrafi } 200*c76d4239SHadi Asyrafi 201*c76d4239SHadi Asyrafi intel_fpga_sdm_write_all(); 202*c76d4239SHadi Asyrafi 203*c76d4239SHadi Asyrafi if (*count > 0) 204*c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_OK; 205*c76d4239SHadi Asyrafi else if (*count == 0) 206*c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_BUSY; 207*c76d4239SHadi Asyrafi 208*c76d4239SHadi Asyrafi for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 209*c76d4239SHadi Asyrafi if (fpga_config_buffers[i].write_requested != 0) { 210*c76d4239SHadi Asyrafi all_completed = 0; 211*c76d4239SHadi Asyrafi break; 212*c76d4239SHadi Asyrafi } 213*c76d4239SHadi Asyrafi } 214*c76d4239SHadi Asyrafi 215*c76d4239SHadi Asyrafi if (all_completed == 1) 216*c76d4239SHadi Asyrafi return INTEL_SIP_SMC_STATUS_OK; 217*c76d4239SHadi Asyrafi 218*c76d4239SHadi Asyrafi return status; 219*c76d4239SHadi Asyrafi } 220*c76d4239SHadi Asyrafi 221*c76d4239SHadi Asyrafi int intel_fpga_config_start(uint32_t config_type) 222*c76d4239SHadi Asyrafi { 223*c76d4239SHadi Asyrafi uint32_t response[3]; 224*c76d4239SHadi Asyrafi int status = 0; 225*c76d4239SHadi Asyrafi 226*c76d4239SHadi Asyrafi status = mailbox_send_cmd(2, MBOX_RECONFIG, 0, 0, 0, 227*c76d4239SHadi Asyrafi response); 228*c76d4239SHadi Asyrafi 229*c76d4239SHadi Asyrafi if (status < 0) 230*c76d4239SHadi Asyrafi return status; 231*c76d4239SHadi Asyrafi 232*c76d4239SHadi Asyrafi max_blocks = response[0]; 233*c76d4239SHadi Asyrafi bytes_per_block = response[1]; 234*c76d4239SHadi Asyrafi 235*c76d4239SHadi Asyrafi for (int i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 236*c76d4239SHadi Asyrafi fpga_config_buffers[i].size = 0; 237*c76d4239SHadi Asyrafi fpga_config_buffers[i].size_written = 0; 238*c76d4239SHadi Asyrafi fpga_config_buffers[i].addr = 0; 239*c76d4239SHadi Asyrafi fpga_config_buffers[i].write_requested = 0; 240*c76d4239SHadi Asyrafi fpga_config_buffers[i].block_number = 0; 241*c76d4239SHadi Asyrafi fpga_config_buffers[i].subblocks_sent = 0; 242*c76d4239SHadi Asyrafi } 243*c76d4239SHadi Asyrafi 244*c76d4239SHadi Asyrafi blocks_submitted = 0; 245*c76d4239SHadi Asyrafi current_block = 0; 246*c76d4239SHadi Asyrafi current_buffer = 0; 247*c76d4239SHadi Asyrafi 248*c76d4239SHadi Asyrafi return 0; 249*c76d4239SHadi Asyrafi } 250*c76d4239SHadi Asyrafi 251*c76d4239SHadi Asyrafi 252*c76d4239SHadi Asyrafi uint32_t intel_fpga_config_write(uint64_t mem, uint64_t size) 253*c76d4239SHadi Asyrafi { 254*c76d4239SHadi Asyrafi int i = 0; 255*c76d4239SHadi Asyrafi uint32_t status = INTEL_SIP_SMC_STATUS_OK; 256*c76d4239SHadi Asyrafi 257*c76d4239SHadi Asyrafi if (mem < DRAM_BASE || mem > DRAM_BASE + DRAM_SIZE) 258*c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_REJECTED; 259*c76d4239SHadi Asyrafi 260*c76d4239SHadi Asyrafi if (mem + size > DRAM_BASE + DRAM_SIZE) 261*c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_REJECTED; 262*c76d4239SHadi Asyrafi 263*c76d4239SHadi Asyrafi for (i = 0; i < FPGA_CONFIG_BUFFER_SIZE; i++) { 264*c76d4239SHadi Asyrafi if (!fpga_config_buffers[i].write_requested) { 265*c76d4239SHadi Asyrafi fpga_config_buffers[i].addr = mem; 266*c76d4239SHadi Asyrafi fpga_config_buffers[i].size = size; 267*c76d4239SHadi Asyrafi fpga_config_buffers[i].size_written = 0; 268*c76d4239SHadi Asyrafi fpga_config_buffers[i].write_requested = 1; 269*c76d4239SHadi Asyrafi fpga_config_buffers[i].block_number = 270*c76d4239SHadi Asyrafi blocks_submitted++; 271*c76d4239SHadi Asyrafi fpga_config_buffers[i].subblocks_sent = 0; 272*c76d4239SHadi Asyrafi break; 273*c76d4239SHadi Asyrafi } 274*c76d4239SHadi Asyrafi } 275*c76d4239SHadi Asyrafi 276*c76d4239SHadi Asyrafi 277*c76d4239SHadi Asyrafi if (i == FPGA_CONFIG_BUFFER_SIZE) { 278*c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_REJECTED; 279*c76d4239SHadi Asyrafi return status; 280*c76d4239SHadi Asyrafi } else if (i == FPGA_CONFIG_BUFFER_SIZE - 1) { 281*c76d4239SHadi Asyrafi status = INTEL_SIP_SMC_STATUS_BUSY; 282*c76d4239SHadi Asyrafi } 283*c76d4239SHadi Asyrafi 284*c76d4239SHadi Asyrafi intel_fpga_sdm_write_all(); 285*c76d4239SHadi Asyrafi 286*c76d4239SHadi Asyrafi return status; 287*c76d4239SHadi Asyrafi } 288*c76d4239SHadi Asyrafi 289*c76d4239SHadi Asyrafi /* 290*c76d4239SHadi Asyrafi * This function is responsible for handling all SiP calls from the NS world 291*c76d4239SHadi Asyrafi */ 292*c76d4239SHadi Asyrafi 293*c76d4239SHadi Asyrafi uintptr_t sip_smc_handler(uint32_t smc_fid, 294*c76d4239SHadi Asyrafi u_register_t x1, 295*c76d4239SHadi Asyrafi u_register_t x2, 296*c76d4239SHadi Asyrafi u_register_t x3, 297*c76d4239SHadi Asyrafi u_register_t x4, 298*c76d4239SHadi Asyrafi void *cookie, 299*c76d4239SHadi Asyrafi void *handle, 300*c76d4239SHadi Asyrafi u_register_t flags) 301*c76d4239SHadi Asyrafi { 302*c76d4239SHadi Asyrafi uint32_t status = INTEL_SIP_SMC_STATUS_OK; 303*c76d4239SHadi Asyrafi uint32_t completed_addr[3]; 304*c76d4239SHadi Asyrafi uint32_t count = 0; 305*c76d4239SHadi Asyrafi 306*c76d4239SHadi Asyrafi switch (smc_fid) { 307*c76d4239SHadi Asyrafi case SIP_SVC_UID: 308*c76d4239SHadi Asyrafi /* Return UID to the caller */ 309*c76d4239SHadi Asyrafi SMC_UUID_RET(handle, intl_svc_uid); 310*c76d4239SHadi Asyrafi break; 311*c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_ISDONE: 312*c76d4239SHadi Asyrafi status = intel_mailbox_fpga_config_isdone(); 313*c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 314*c76d4239SHadi Asyrafi break; 315*c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM: 316*c76d4239SHadi Asyrafi SMC_RET3(handle, INTEL_SIP_SMC_STATUS_OK, 317*c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR, 318*c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_SIZE - 319*c76d4239SHadi Asyrafi INTEL_SIP_SMC_FPGA_CONFIG_ADDR); 320*c76d4239SHadi Asyrafi break; 321*c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_START: 322*c76d4239SHadi Asyrafi status = intel_fpga_config_start(x1); 323*c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 324*c76d4239SHadi Asyrafi break; 325*c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_WRITE: 326*c76d4239SHadi Asyrafi status = intel_fpga_config_write(x1, x2); 327*c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 328*c76d4239SHadi Asyrafi break; 329*c76d4239SHadi Asyrafi case INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE: 330*c76d4239SHadi Asyrafi status = intel_fpga_config_completed_write(completed_addr, 331*c76d4239SHadi Asyrafi &count); 332*c76d4239SHadi Asyrafi switch (count) { 333*c76d4239SHadi Asyrafi case 1: 334*c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 335*c76d4239SHadi Asyrafi completed_addr[0], 0, 0); 336*c76d4239SHadi Asyrafi break; 337*c76d4239SHadi Asyrafi case 2: 338*c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 339*c76d4239SHadi Asyrafi completed_addr[0], 340*c76d4239SHadi Asyrafi completed_addr[1], 0); 341*c76d4239SHadi Asyrafi break; 342*c76d4239SHadi Asyrafi case 3: 343*c76d4239SHadi Asyrafi SMC_RET4(handle, INTEL_SIP_SMC_STATUS_OK, 344*c76d4239SHadi Asyrafi completed_addr[0], 345*c76d4239SHadi Asyrafi completed_addr[1], 346*c76d4239SHadi Asyrafi completed_addr[2]); 347*c76d4239SHadi Asyrafi break; 348*c76d4239SHadi Asyrafi case 0: 349*c76d4239SHadi Asyrafi SMC_RET4(handle, status, 0, 0, 0); 350*c76d4239SHadi Asyrafi break; 351*c76d4239SHadi Asyrafi default: 352*c76d4239SHadi Asyrafi SMC_RET1(handle, INTEL_SIP_SMC_STATUS_ERROR); 353*c76d4239SHadi Asyrafi } 354*c76d4239SHadi Asyrafi break; 355*c76d4239SHadi Asyrafi 356*c76d4239SHadi Asyrafi default: 357*c76d4239SHadi Asyrafi return socfpga_sip_handler(smc_fid, x1, x2, x3, x4, 358*c76d4239SHadi Asyrafi cookie, handle, flags); 359*c76d4239SHadi Asyrafi } 360*c76d4239SHadi Asyrafi } 361*c76d4239SHadi Asyrafi 362*c76d4239SHadi Asyrafi DECLARE_RT_SVC( 363*c76d4239SHadi Asyrafi socfpga_sip_svc, 364*c76d4239SHadi Asyrafi OEN_SIP_START, 365*c76d4239SHadi Asyrafi OEN_SIP_END, 366*c76d4239SHadi Asyrafi SMC_TYPE_FAST, 367*c76d4239SHadi Asyrafi NULL, 368*c76d4239SHadi Asyrafi sip_smc_handler 369*c76d4239SHadi Asyrafi ); 370*c76d4239SHadi Asyrafi 371*c76d4239SHadi Asyrafi DECLARE_RT_SVC( 372*c76d4239SHadi Asyrafi socfpga_sip_svc_std, 373*c76d4239SHadi Asyrafi OEN_SIP_START, 374*c76d4239SHadi Asyrafi OEN_SIP_END, 375*c76d4239SHadi Asyrafi SMC_TYPE_YIELD, 376*c76d4239SHadi Asyrafi NULL, 377*c76d4239SHadi Asyrafi sip_smc_handler 378*c76d4239SHadi Asyrafi ); 379