xref: /arm-trusted-firmware/plat/intel/soc/common/socfpga_sip_svc.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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