/*
 * Copyright 2022-2023 NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_S32_NETC_PRIV_H_
#define ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_S32_NETC_PRIV_H_

#define NETC_F3_PSICFGR0_SIVC_CVLAN_BIT	BIT(0)	/* 0x8100 */
#define NETC_F3_PSICFGR0_SIVC_SVLAN_BIT	BIT(1)	/* 0x88A8 */

#define NETC_MIN_RING_LEN	8U
#define NETC_MIN_RING_BUF_SIZE	64U

#define NETC_SWITCH_IDX		0U
#define NETC_SWITCH_PORT_IDX	0U
#define NETC_SWITCH_PORT_AGING	300U
#define NETC_ETH_0_RX_CLK_IDX	49U
#define NETC_ETH_1_RX_CLK_IDX	51U

#define NETC_MSIX_EVENTS_COUNT	2U

/* Timeout for various operations */
#define NETC_TIMEOUT		K_MSEC(20)

/* Helper macros to convert from Zephyr PHY speed to NETC baudrate/duplex types */
#define PHY_TO_NETC_SPEED(x) \
	(PHY_LINK_IS_SPEED_1000M(x) ? ETHTRCV_BAUD_RATE_1000MBIT : \
		(PHY_LINK_IS_SPEED_100M(x) ? ETHTRCV_BAUD_RATE_100MBIT : ETHTRCV_BAUD_RATE_10MBIT))

#define PHY_TO_NETC_DUPLEX_MODE(x) \
	(PHY_LINK_IS_FULL_DUPLEX(x) ? NETC_ETHSWT_PORT_FULL_DUPLEX : NETC_ETHSWT_PORT_HALF_DUPLEX)

/*
 * Get the first MRU mailbox address for an specific mbox handle
 * mbox[0] addr = MRU base addr + (channel × channel offset), with channel=1..N
 */
#define MRU_CHANNEL_OFFSET	0x1000
#define MRU_MBOX_ADDR(node, name)						\
	(DT_REG_ADDR(DT_MBOX_CTLR_BY_NAME(node, name))				\
	 + ((DT_MBOX_CHANNEL_BY_NAME(node, name) + 1) * MRU_CHANNEL_OFFSET))

#define NETC_MSIX(node, name, cb)					\
	{								\
		.handler = cb,						\
		.mbox_channel = MBOX_DT_CHANNEL_GET(node, name),	\
	}

/* Tx/Rx ENETC ring definitions */
#define _NETC_RING(n, idx, len, buf_size, prefix1, prefix2)					\
	static Netc_Eth_Ip_##prefix1##BDRType nxp_s32_eth##n##_##prefix2##ring##idx##_desc[len]	\
		__nocache __aligned(FEATURE_NETC_BUFFDESCR_ALIGNMENT_BYTES);			\
	static uint8_t nxp_s32_eth##n##_##prefix2##ring##idx##_buf[len * buf_size]		\
		__nocache __aligned(FEATURE_NETC_BUFF_ALIGNMENT_BYTES)

#define NETC_RX_RING(n, idx, len, buf_size)	_NETC_RING(n, idx, len, buf_size, Rx, rx)
#define NETC_TX_RING(n, idx, len, buf_size)	_NETC_RING(n, idx, len, buf_size, Tx, tx)

/* Helper function to generate an Ethernet MAC address for a given ENETC instance */
#define FREESCALE_OUI_B0 0x00
#define FREESCALE_OUI_B1 0x04
#define FREESCALE_OUI_B2 0x9f

#define _NETC_GENERATE_MAC_ADDRESS_RANDOM	\
	gen_random_mac(mac_addr, FREESCALE_OUI_B0, FREESCALE_OUI_B1, FREESCALE_OUI_B2)

#define _NETC_GENERATE_MAC_ADDRESS_UNIQUE(n)				\
	do {								\
		uint32_t id = 0x001100;					\
									\
		mac_addr[0] = FREESCALE_OUI_B0;				\
		mac_addr[1] = FREESCALE_OUI_B1;				\
		/* Set MAC address locally administered bit (LAA) */	\
		mac_addr[2] = FREESCALE_OUI_B2 | 0x02;			\
		mac_addr[3] = (id >> 16) & 0xff;			\
		mac_addr[4] = (id >> 8) & 0xff;				\
		mac_addr[5] = (id + n) & 0xff;				\
	} while (0)

#define NETC_GENERATE_MAC_ADDRESS(n)						\
	static void nxp_s32_eth##n##_generate_mac(uint8_t mac_addr[6])		\
	{									\
		COND_CODE_1(DT_INST_PROP(n, zephyr_random_mac_address),		\
			(_NETC_GENERATE_MAC_ADDRESS_RANDOM),			\
			(COND_CODE_0(DT_INST_NODE_HAS_PROP(n, local_mac_address),\
				(_NETC_GENERATE_MAC_ADDRESS_UNIQUE(n)),		\
				(ARG_UNUSED(mac_addr)))));			\
	}

#define NETC_SI_NXP_S32_HW_INSTANCE_CHECK(i, n) \
	((DT_INST_REG_ADDR(n) == IP_NETC__ENETC0_SI##i##_BASE) ? i : 0)

#define NETC_SI_NXP_S32_HW_INSTANCE(n)					\
	LISTIFY(__DEBRACKET FEATURE_NETC_ETH_NUMBER_OF_CTRLS,		\
			NETC_SI_NXP_S32_HW_INSTANCE_CHECK, (|), n)

/* Helper macros to concatenate tokens that require further expansions */
#define _CONCAT3(a, b, c)	DT_CAT3(a, b, c)

struct nxp_s32_eth_msix {
	void (*handler)(uint8_t chan, const uint32_t *buf, uint8_t buf_size);
	struct mbox_channel mbox_channel;
};

struct nxp_s32_eth_config {
	const Netc_Eth_Ip_ConfigType netc_cfg;

	Netc_Eth_Ip_MACFilterHashTableEntryType *mac_filter_hash_table;

	uint8_t si_idx;
	uint8_t port_idx;
	const struct device *phy_dev;
	uint8_t tx_ring_idx;
	uint8_t rx_ring_idx;
	void (*generate_mac)(uint8_t *mac_addr);
	struct nxp_s32_eth_msix msix[NETC_MSIX_EVENTS_COUNT];
	const struct pinctrl_dev_config *pincfg;
};

struct nxp_s32_eth_data {
	struct net_if *iface;
	uint8_t mac_addr[6];
	struct k_mutex tx_mutex;
	struct k_sem rx_sem;
	struct k_thread rx_thread;

	K_KERNEL_STACK_MEMBER(rx_thread_stack, CONFIG_ETH_NXP_S32_RX_THREAD_STACK_SIZE);
};

int nxp_s32_eth_initialize_common(const struct device *dev);
int nxp_s32_eth_tx(const struct device *dev, struct net_pkt *pkt);
enum ethernet_hw_caps nxp_s32_eth_get_capabilities(const struct device *dev);
void nxp_s32_eth_mcast_cb(struct net_if *iface, const struct net_addr *addr, bool is_joined);
int nxp_s32_eth_set_config(const struct device *dev, enum ethernet_config_type type,
			   const struct ethernet_config *config);
extern void Netc_Eth_Ip_MSIX_Rx(uint8_t si_idx);

#endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_S32_NETC_PRIV_H_ */
