xref: /rk3399_ARM-atf/plat/intel/soc/common/socfpga_sip_svc.c (revision c76d42398990044ea84b6348d77a5f34bd7e9a8e)
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