xref: /rk3399_ARM-atf/plat/intel/soc/common/soc/socfpga_handoff.c (revision 8329be5ae751423e482c056c7adf3248639273d3)
1 /*
2  * Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
3  * Copyright (c) 2024, Altera Corporation. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <errno.h>
9 #include <string.h>
10 
11 #include "socfpga_handoff.h"
12 #include "socfpga_private.h"
13 
14 #define SWAP_UINT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) |	\
15 				(((x) & 0x0000FF00) << 8) | ((x) << 24))
16 
socfpga_get_handoff(handoff * reverse_hoff_ptr)17 int socfpga_get_handoff(handoff *reverse_hoff_ptr)
18 {
19 	int i;
20 	int j;
21 	uint32_t *buffer;
22 	uint32_t *handoff_ptr = (uint32_t *) PLAT_HANDOFF_OFFSET;
23 	uint32_t *reverse_hoff_ptr_dst = (uint32_t *) reverse_hoff_ptr;
24 
25 	if (sizeof(*handoff_ptr) > sizeof(handoff)) {
26 		return -EOVERFLOW;
27 	}
28 
29 	for (j = 0; j < sizeof(handoff) / 4; j++) {
30 		memcpy_s((void *) (reverse_hoff_ptr_dst + j), 1,
31 			(void *) (handoff_ptr + j), 1);
32 	}
33 
34 	buffer = (uint32_t *)reverse_hoff_ptr_dst;
35 
36 	/* convert big endian to little endian */
37 	for (i = 0; i < sizeof(handoff) / 4; i++)
38 		buffer[i] = SWAP_UINT32(buffer[i]);
39 
40 	if (reverse_hoff_ptr->header_magic != HANDOFF_MAGIC_HEADER) {
41 		return -1;
42 	}
43 	if (reverse_hoff_ptr->pinmux_sel_magic != HANDOFF_MAGIC_PINMUX_SEL) {
44 		return -1;
45 	}
46 	if (reverse_hoff_ptr->pinmux_io_magic != HANDOFF_MAGIC_IOCTLR) {
47 		return -1;
48 	}
49 	if (reverse_hoff_ptr->pinmux_fpga_magic != HANDOFF_MAGIC_FPGA) {
50 		return -1;
51 	}
52 	if (reverse_hoff_ptr->pinmux_delay_magic != HANDOFF_MAGIC_IODELAY) {
53 		return -1;
54 	}
55 	if (reverse_hoff_ptr->clock_magic != HANDOFF_MAGIC_CLOCK) {
56 		return -1;
57 	}
58 
59 #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
60 	if (reverse_hoff_ptr->peripheral_pwr_gate_magic != HANDOFF_MAGIC_PERIPHERAL) {
61 		return -1;
62 	}
63 
64 	if (reverse_hoff_ptr->ddr_magic != HANDOFF_MAGIC_DDR) {
65 		return -1;
66 	}
67 #endif
68 
69 	return 0;
70 }
71