1 /*
2  * Copyright 2024 NXP
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #include <zephyr/devicetree.h>
7 #include <zephyr/platform/hooks.h>
8 #include <soc.h>
9 
10 #if CONFIG_BOARD_EARLY_INIT_HOOK
board_early_init_hook(void)11 void board_early_init_hook(void)
12 {
13 #if defined(CONFIG_ETH_NXP_IMX_NETC) && (DT_CHILD_NUM_STATUS_OKAY(DT_NODELABEL(netc)) != 0)
14 	/* RMII mode */
15 	BLK_CTRL_WAKEUPMIX->NETC_LINK_CFG[0] = BLK_CTRL_WAKEUPMIX_NETC_LINK_CFG_MII_PROT(1);
16 	BLK_CTRL_WAKEUPMIX->NETC_LINK_CFG[4] = BLK_CTRL_WAKEUPMIX_NETC_LINK_CFG_MII_PROT(1);
17 	/* RGMII mode */
18 	BLK_CTRL_WAKEUPMIX->NETC_LINK_CFG[1] = BLK_CTRL_WAKEUPMIX_NETC_LINK_CFG_MII_PROT(2);
19 	BLK_CTRL_WAKEUPMIX->NETC_LINK_CFG[2] = BLK_CTRL_WAKEUPMIX_NETC_LINK_CFG_MII_PROT(2);
20 	BLK_CTRL_WAKEUPMIX->NETC_LINK_CFG[3] = BLK_CTRL_WAKEUPMIX_NETC_LINK_CFG_MII_PROT(2);
21 
22 	/* Output reference clock for RMII */
23 	BLK_CTRL_WAKEUPMIX->NETC_PORT_MISC_CFG |=
24 		BLK_CTRL_WAKEUPMIX_NETC_PORT_MISC_CFG_PORT4_RMII_REF_CLK_DIR_MASK |
25 		BLK_CTRL_WAKEUPMIX_NETC_PORT_MISC_CFG_PORT0_RMII_REF_CLK_DIR_MASK;
26 
27 	/* Unlock the IERB. It will warm reset whole NETC. */
28 	NETC_PRIV->NETCRR &= ~NETC_PRIV_NETCRR_LOCK_MASK;
29 
30 	while ((NETC_PRIV->NETCRR & NETC_PRIV_NETCRR_LOCK_MASK) != 0U) {
31 	}
32 
33 	/* Set the access attribute, otherwise MSIX access will be blocked. */
34 	NETC_IERB->ARRAY_NUM_RC[0].RCMSIAMQR &= ~(7U << 27);
35 	NETC_IERB->ARRAY_NUM_RC[0].RCMSIAMQR |= (1U << 27);
36 
37 	/* Lock the IERB. */
38 	NETC_PRIV->NETCRR |= NETC_PRIV_NETCRR_LOCK_MASK;
39 	while ((NETC_PRIV->NETCSR & NETC_PRIV_NETCSR_STATE_MASK) != 0U) {
40 	}
41 #endif
42 }
43 #endif
44