1 /*
2  * Copyright 2024-2025 NXP
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_IMX_NETC_PRIV_H_
8 #define ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_IMX_NETC_PRIV_H_
9 
10 #include "nxp_imx_netc.h"
11 #include "fsl_netc_endpoint.h"
12 #include "fsl_msgintr.h"
13 
14 /* Buffer and descriptor alignment */
15 #define NETC_BUFF_ALIGN 64
16 #define NETC_RX_RING_BUF_SIZE_ALIGN                                                                \
17 	SDK_SIZEALIGN(CONFIG_ETH_NXP_IMX_RX_RING_BUF_SIZE, NETC_BUFF_ALIGN)
18 
19 /* MSIX definitions */
20 #define NETC_TX_MSIX_ENTRY_IDX 0
21 #define NETC_RX_MSIX_ENTRY_IDX 1
22 #define NETC_MSIX_ENTRY_NUM    2
23 
24 #define NETC_MSIX_EVENTS_COUNT      NETC_MSIX_ENTRY_NUM
25 #define NETC_TX_INTR_MSG_DATA_START 0
26 #define NETC_RX_INTR_MSG_DATA_START 16
27 #define NETC_DRV_MAX_INST_SUPPORT   16
28 
29 /* MSGINTR */
30 #define NETC_MSGINTR_CHANNEL 0
31 
32 #if (CONFIG_ETH_NXP_IMX_MSGINTR == 1)
33 #define NETC_MSGINTR     MSGINTR1
34 #define NETC_MSGINTR_IRQ MSGINTR1_IRQn
35 #elif (CONFIG_ETH_NXP_IMX_MSGINTR == 2)
36 #define NETC_MSGINTR     MSGINTR2
37 #define NETC_MSGINTR_IRQ MSGINTR2_IRQn
38 #else
39 #error "Current CONFIG_ETH_NXP_IMX_MSGINTR not support"
40 #endif
41 
42 /* Timeout for various operations */
43 #define NETC_TIMEOUT K_MSEC(20)
44 
45 /* Helper function to generate an Ethernet MAC address for a given ENETC instance */
46 #define FREESCALE_OUI_B0 0x00
47 #define FREESCALE_OUI_B1 0x04
48 #define FREESCALE_OUI_B2 0x9f
49 
50 #define _NETC_GENERATE_MAC_ADDRESS_RANDOM                                                          \
51 	gen_random_mac(mac_addr, FREESCALE_OUI_B0, FREESCALE_OUI_B1, FREESCALE_OUI_B2)
52 
53 #define _NETC_GENERATE_MAC_ADDRESS_UNIQUE(n)                                                       \
54 	do {                                                                                       \
55 		uint32_t id = 0x001100;                                                            \
56                                                                                                    \
57 		mac_addr[0] = FREESCALE_OUI_B0;                                                    \
58 		mac_addr[1] = FREESCALE_OUI_B1;                                                    \
59 		/* Set MAC address locally administered bit (LAA) */                               \
60 		mac_addr[2] = FREESCALE_OUI_B2 | 0x02;                                             \
61 		mac_addr[3] = (id >> 16) & 0xff;                                                   \
62 		mac_addr[4] = (id >> 8) & 0xff;                                                    \
63 		mac_addr[5] = (id + n) & 0xff;                                                     \
64 	} while (0)
65 
66 #define NETC_GENERATE_MAC_ADDRESS(n)                                                               \
67 	static void netc_eth##n##_generate_mac(uint8_t mac_addr[6])                                \
68 	{                                                                                          \
69 		COND_CODE_1(DT_INST_PROP(n, zephyr_random_mac_address),                            \
70 			    (_NETC_GENERATE_MAC_ADDRESS_RANDOM),                                   \
71 			    (COND_CODE_0(DT_INST_NODE_HAS_PROP(n, local_mac_address),              \
72 					 (_NETC_GENERATE_MAC_ADDRESS_UNIQUE(n)),                   \
73 					 (ARG_UNUSED(mac_addr)))));                      \
74 	}
75 
76 struct netc_eth_config {
77 	uint16_t si_idx;
78 	const struct device *phy_dev;
79 	netc_hw_mii_mode_t phy_mode;
80 	volatile bool pseudo_mac;
81 	void (*generate_mac)(uint8_t *mac_addr);
82 	void (*bdr_init)(netc_bdr_config_t *bdr_config, netc_rx_bdr_config_t *rx_bdr_config,
83 			 netc_tx_bdr_config_t *tx_bdr_config);
84 	const struct pinctrl_dev_config *pincfg;
85 	uint8_t tx_intr_msg_data;
86 	uint8_t rx_intr_msg_data;
87 };
88 
89 typedef uint8_t rx_buffer_t[NETC_RX_RING_BUF_SIZE_ALIGN];
90 
91 struct netc_eth_data {
92 	ep_handle_t handle;
93 	struct net_if *iface;
94 	uint8_t mac_addr[6];
95 	/* TX */
96 	struct k_mutex tx_mutex;
97 	netc_tx_frame_info_t tx_info;
98 	uint8_t *tx_buff;
99 	volatile bool tx_done;
100 	/* RX */
101 	struct k_sem rx_sem;
102 	struct k_thread rx_thread;
103 
104 	K_KERNEL_STACK_MEMBER(rx_thread_stack, CONFIG_ETH_NXP_IMX_RX_THREAD_STACK_SIZE);
105 	uint8_t *rx_frame;
106 };
107 
108 int netc_eth_init_common(const struct device *dev);
109 int netc_eth_tx(const struct device *dev, struct net_pkt *pkt);
110 enum ethernet_hw_caps netc_eth_get_capabilities(const struct device *dev);
111 int netc_eth_set_config(const struct device *dev, enum ethernet_config_type type,
112 			const struct ethernet_config *config);
113 
114 #endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_IMX_NETC_PRIV_H_ */
115