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