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)17int 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