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