/* SPDX-License-Identifier: BSD-3-Clause
 *
 *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
 *   Copyright 2016 NXP
 *
 */

/**
 * @file
 *
 * DPNI packet parse results - implementation internal
 */

#ifndef _DPAA2_HW_DPNI_ANNOT_H_
#define _DPAA2_HW_DPNI_ANNOT_H_

#ifdef __cplusplus
extern "C" {
#endif

/* Annotation valid bits in FD FRC */
#define DPAA2_FD_FRC_FASV	0x8000
#define DPAA2_FD_FRC_FAEADV	0x4000
#define DPAA2_FD_FRC_FAPRV	0x2000
#define DPAA2_FD_FRC_FAIADV	0x1000
#define DPAA2_FD_FRC_FASWOV	0x0800
#define DPAA2_FD_FRC_FAICFDV	0x0400

/* Annotation bits in FD CTRL */
#define DPAA2_FD_CTRL_ASAL	0x00020000      /* ASAL = 128 */
#define DPAA2_FD_CTRL_PTA	0x00800000
#define DPAA2_FD_CTRL_PTV1	0x00400000

/* Frame annotation status */
struct dpaa2_fas {
	uint8_t reserved;
	uint8_t ppid;
	__le16 ifpid;
	__le32 status;
}  __attribute__((__packed__));

/**
 * HW Packet Annotation  Register structures
 */
struct dpaa2_annot_hdr {
	/**<	word1: Frame Annotation Status (8 bytes)*/
	uint64_t word1;

	/**<	word2: Time Stamp (8 bytes)*/
	uint64_t word2;

	/**<	word3: Next Hdr + FAF Extension + FAF (2 + 2 + 4 bytes)*/
	uint64_t word3;

	/**<	word4: Frame Annotation Flags-FAF (8 bytes) */
	uint64_t word4;

	/**<	word5:
	 *	ShimOffset_1 + ShimOffset_2 + IPPIDOffset + EthOffset +
	 *	LLC+SNAPOffset + VLANTCIOffset_1 + VLANTCIOffset_n +
	 *	LastETypeOffset (1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 bytes)
	 */
	uint64_t word5;

	/**<	word6:
	 *	PPPoEOffset + MPLSOffset_1 + MPLSOffset_n + ARPorIPOffset_1
	 *	+ IPOffset_norMInEncapO + GREOffset + L4Offset +
	 *	GTPorESPorIPSecOffset(1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 bytes)
	 */
	uint64_t word6;

	/**<	word7:
	 *	RoutingHdrOfset1 + RoutingHdrOfset2 + NxtHdrOffset
	 *	+ IPv6FragOffset + GrossRunningSum
	 *	+ RunningSum(1 + 1 + 1 + 1 + 2 + 2 bytes)
	 */
	uint64_t word7;

	/**<	word8:
	 *	ParseErrorcode + Soft Parsing Context (1 + 7 bytes)
	 */
	uint64_t word8;
};

/**
 * Internal Macros to get/set Packet annotation header
 */

/** General Macro to define a particular bit position*/
#define BIT_POS(x)			((uint64_t)1 << ((x)))
/** Set a bit in the variable */
#define BIT_SET_AT_POS(var, pos)	((var) |= (pos))
/** Reset the bit in the variable */
#define BIT_RESET_AT_POS(var, pos)	((var) &= ~(pos))
/** Check the bit is set in the variable */
#define BIT_ISSET_AT_POS(var, pos)	(((var) & (pos)) ? 1 : 0)
/**
 * Macrso to define bit position in word3
 */
#define NEXT_HDR(var)			((uint64_t)(var) & 0xFFFF000000000000)
#define FAF_EXTN_IPV6_ROUTE_HDR_PRESENT(var)	BIT_POS(16)
#define FAF_EXTN_RESERVED(var)		((uint64_t)(var) & 0x00007FFF00000000)
#define FAF_USER_DEFINED_RESERVED(var)	((uint64_t)(var) & 0x00000000FF000000)
#define SHIM_SHELL_SOFT_PARSING_ERRROR		BIT_POS(23)
#define PARSING_ERROR				BIT_POS(22)
#define L2_ETH_MAC_PRESENT			BIT_POS(21)
#define L2_ETH_MAC_UNICAST			BIT_POS(20)
#define L2_ETH_MAC_MULTICAST			BIT_POS(19)
#define L2_ETH_MAC_BROADCAST			BIT_POS(18)
#define L2_ETH_FRAME_IS_BPDU			BIT_POS(17)
#define L2_ETH_FCOE_PRESENT			BIT_POS(16)
#define L2_ETH_FIP_PRESENT			BIT_POS(15)
#define L2_ETH_PARSING_ERROR			BIT_POS(14)
#define L2_LLC_SNAP_PRESENT			BIT_POS(13)
#define L2_UNKNOWN_LLC_OUI			BIT_POS(12)
#define L2_LLC_SNAP_ERROR			BIT_POS(11)
#define L2_VLAN_1_PRESENT			BIT_POS(10)
#define L2_VLAN_N_PRESENT			BIT_POS(9)
#define L2_VLAN_CFI_BIT_PRESENT			BIT_POS(8)
#define L2_VLAN_PARSING_ERROR			BIT_POS(7)
#define L2_PPPOE_PPP_PRESENT			BIT_POS(6)
#define L2_PPPOE_PPP_PARSING_ERROR		BIT_POS(5)
#define L2_MPLS_1_PRESENT			BIT_POS(4)
#define L2_MPLS_N_PRESENT			BIT_POS(3)
#define L2_MPLS_PARSING_ERROR			BIT_POS(2)
#define L2_ARP_PRESENT				BIT_POS(1)
#define L2_ARP_PARSING_ERROR			BIT_POS(0)
/**
 * Macrso to define bit position in word4
 */
#define L2_UNKNOWN_PROTOCOL			BIT_POS(63)
#define L2_SOFT_PARSING_ERROR			BIT_POS(62)
#define L3_IPV4_1_PRESENT			BIT_POS(61)
#define L3_IPV4_1_UNICAST			BIT_POS(60)
#define L3_IPV4_1_MULTICAST			BIT_POS(59)
#define L3_IPV4_1_BROADCAST			BIT_POS(58)
#define L3_IPV4_N_PRESENT			BIT_POS(57)
#define L3_IPV4_N_UNICAST			BIT_POS(56)
#define L3_IPV4_N_MULTICAST			BIT_POS(55)
#define L3_IPV4_N_BROADCAST			BIT_POS(54)
#define L3_IPV6_1_PRESENT			BIT_POS(53)
#define L3_IPV6_1_UNICAST			BIT_POS(52)
#define L3_IPV6_1_MULTICAST			BIT_POS(51)
#define L3_IPV6_N_PRESENT			BIT_POS(50)
#define L3_IPV6_N_UNICAST			BIT_POS(49)
#define L3_IPV6_N_MULTICAST			BIT_POS(48)
#define L3_IP_1_OPT_PRESENT			BIT_POS(47)
#define L3_IP_1_UNKNOWN_PROTOCOL		BIT_POS(46)
#define L3_IP_1_MORE_FRAGMENT			BIT_POS(45)
#define L3_IP_1_FIRST_FRAGMENT			BIT_POS(44)
#define L3_IP_1_PARSING_ERROR			BIT_POS(43)
#define L3_IP_N_OPT_PRESENT			BIT_POS(42)
#define L3_IP_N_UNKNOWN_PROTOCOL		BIT_POS(41)
#define L3_IP_N_MORE_FRAGMENT			BIT_POS(40)
#define L3_IP_N_FIRST_FRAGMENT			BIT_POS(39)
#define L3_PROTO_ICMP_PRESENT			BIT_POS(38)
#define L3_PROTO_IGMP_PRESENT			BIT_POS(37)
#define L3_PROTO_ICMPV6_PRESENT			BIT_POS(36)
#define L3_PROTO_UDP_LIGHT_PRESENT		BIT_POS(35)
#define L3_IP_N_PARSING_ERROR			BIT_POS(34)
#define L3_MIN_ENCAP_PRESENT			BIT_POS(33)
#define L3_MIN_ENCAP_SBIT_PRESENT		BIT_POS(32)
#define L3_MIN_ENCAP_PARSING_ERROR		BIT_POS(31)
#define L3_PROTO_GRE_PRESENT			BIT_POS(30)
#define L3_PROTO_GRE_RBIT_PRESENT		BIT_POS(29)
#define L3_PROTO_GRE_PARSING_ERROR		BIT_POS(28)
#define L3_IP_UNKNOWN_PROTOCOL			BIT_POS(27)
#define L3_SOFT_PARSING_ERROR			BIT_POS(26)
#define L3_PROTO_UDP_PRESENT			BIT_POS(25)
#define L3_PROTO_UDP_PARSING_ERROR		BIT_POS(24)
#define L3_PROTO_TCP_PRESENT			BIT_POS(23)
#define L3_PROTO_TCP_OPT_PRESENT		BIT_POS(22)
#define L3_PROTO_TCP_CTRL_BIT_6_TO_11_PRESENT	BIT_POS(21)
#define L3_PROTO_TCP_CTRL_BIT_3_TO_5_PRESENT	BIT_POS(20)
#define L3_PROTO_TCP_PARSING_ERROR		BIT_POS(19)
#define L3_PROTO_IPSEC_PRESENT			BIT_POS(18)
#define L3_PROTO_IPSEC_ESP_PRESENT		BIT_POS(17)
#define L3_PROTO_IPSEC_AH_PRESENT		BIT_POS(16)
#define L3_PROTO_IPSEC_PARSING_ERROR		BIT_POS(15)
#define L3_PROTO_SCTP_PRESENT			BIT_POS(14)
#define L3_PROTO_SCTP_PARSING_ERROR		BIT_POS(13)
#define L3_PROTO_DCCP_PRESENT			BIT_POS(12)
#define L3_PROTO_DCCP_PARSING_ERROR		BIT_POS(11)
#define L4_UNKNOWN_PROTOCOL			BIT_POS(10)
#define L4_SOFT_PARSING_ERROR			BIT_POS(9)
#define L3_PROTO_GTP_PRESENT			BIT_POS(8)
#define L3_PROTO_GTP_PARSING_ERROR		BIT_POS(7)
#define L3_PROTO_ESP_PRESENT			BIT_POS(6)
#define L3_PROTO_ESP_PARSING_ERROR		BIT_POS(5)
#define L3_PROTO_ISCSI_PRESENT			BIT_POS(4)
#define L3_PROTO_CAPWAN__CTRL_PRESENT		BIT_POS(3)
#define L3_PROTO_CAPWAN__DATA_PRESENT		BIT_POS(2)
#define L5_SOFT_PARSING_ERROR			BIT_POS(1)
#define L3_IPV6_ROUTE_HDR_PRESENT		BIT_POS(0)

#define DPAA2_L3_IPv4 (L3_IPV4_1_PRESENT | L3_IPV4_1_UNICAST | \
	L3_IP_1_UNKNOWN_PROTOCOL | L3_IP_UNKNOWN_PROTOCOL)

#define DPAA2_L3_IPv6 (L3_IPV6_1_PRESENT | L3_IPV6_1_UNICAST | \
	L3_IP_1_UNKNOWN_PROTOCOL | L3_IP_UNKNOWN_PROTOCOL)

#define DPAA2_L3_IPv4_TCP (L3_IPV4_1_PRESENT | L3_IPV4_1_UNICAST | \
	L3_PROTO_TCP_PRESENT | L3_PROTO_TCP_CTRL_BIT_6_TO_11_PRESENT | \
	L4_UNKNOWN_PROTOCOL)

#define DPAA2_L3_IPv4_UDP (L3_IPV4_1_PRESENT | L3_IPV4_1_UNICAST | \
	L3_PROTO_UDP_PRESENT | L4_UNKNOWN_PROTOCOL)

#define DPAA2_L3_IPv6_TCP (L3_IPV6_1_PRESENT | L3_IPV6_1_UNICAST | \
	L3_PROTO_TCP_PRESENT | L3_PROTO_TCP_CTRL_BIT_6_TO_11_PRESENT | \
	L4_UNKNOWN_PROTOCOL)

#define DPAA2_L3_IPv6_UDP (L3_IPV6_1_PRESENT | L3_IPV6_1_UNICAST | \
	L3_PROTO_UDP_PRESENT | L4_UNKNOWN_PROTOCOL)

/**
 * Macros to get values in word5
 */
#define SHIM_OFFSET_1(var)		((uint64_t)(var) & 0xFF00000000000000)
#define SHIM_OFFSET_2(var)		((uint64_t)(var) & 0x00FF000000000000)
#define IP_PID_OFFSET(var)		((uint64_t)(var) & 0x0000FF0000000000)
#define ETH_OFFSET(var)			((uint64_t)(var) & 0x000000FF00000000)
#define LLC_SNAP_OFFSET(var)		((uint64_t)(var) & 0x00000000FF000000)
#define VLAN_TCI_OFFSET_1(var)		((uint64_t)(var) & 0x0000000000FF0000)
#define VLAN_TCI_OFFSET_N(var)		((uint64_t)(var) & 0x000000000000FF00)
#define LAST_ETYPE_OFFSET(var)		((uint64_t)(var) & 0x00000000000000FF)

/**
 * Macros to get values in word6
 */
#define PPPOE_OFFSET(var)		((uint64_t)(var) & 0xFF00000000000000)
#define MPLS_OFFSET_1(var)		((uint64_t)(var) & 0x00FF000000000000)
#define MPLS_OFFSET_N(var)		((uint64_t)(var) & 0x0000FF0000000000)
#define ARP_OR_IP_OFFSET_1(var)		((uint64_t)(var) & 0x000000FF00000000)
#define IP_N_OR_MIN_ENCAP_OFFSET(var)	((uint64_t)(var) & 0x00000000FF000000)
#define GRE_OFFSET(var)			((uint64_t)(var) & 0x0000000000FF0000)
#define L4_OFFSET(var)			((uint64_t)(var) & 0x000000000000FF00)
#define GTP_OR_ESP_OR_IPSEC_OFFSET(var)	((uint64_t)(var) & 0x00000000000000FF)

/**
 * Macros to get values in word7
 */
#define IPV6_ROUTING_HDR_OFFSET_1(var)	((uint64_t)(var) & 0xFF00000000000000)
#define IPV6_ROUTING_HDR_OFFSET_2(var)	((uint64_t)(var) & 0x00FF000000000000)
#define NEXT_HDR_OFFSET(var)		((uint64_t)(var) & 0x0000FF0000000000)
#define IPV6_FRAG_OFFSET(var)		((uint64_t)(var) & 0x000000FF00000000)
#define GROSS_RUNNING_SUM(var)		((uint64_t)(var) & 0x00000000FFFF0000)
#define RUNNING_SUM(var)		((uint64_t)(var) & 0x000000000000FFFF)

/**
 * Macros to get values in word8
 */
#define PARSE_ERROR_CODE(var)		((uint64_t)(var) & 0xFF00000000000000)
#define SOFT_PARSING_CONTEXT(var)	((uint64_t)(var) & 0x00FFFFFFFFFFFFFF)

/* Debug frame, otherwise supposed to be discarded */
#define DPAA2_ETH_FAS_DISC	      0x80000000
/* MACSEC frame */
#define DPAA2_ETH_FAS_MS		0x40000000
#define DPAA2_ETH_FAS_PTP	       0x08000000
/* Ethernet multicast frame */
#define DPAA2_ETH_FAS_MC		0x04000000
/* Ethernet broadcast frame */
#define DPAA2_ETH_FAS_BC		0x02000000
#define DPAA2_ETH_FAS_KSE	       0x00040000
#define DPAA2_ETH_FAS_EOFHE	     0x00020000
#define DPAA2_ETH_FAS_MNLE	      0x00010000
#define DPAA2_ETH_FAS_TIDE	      0x00008000
#define DPAA2_ETH_FAS_PIEE	      0x00004000
/* Frame length error */
#define DPAA2_ETH_FAS_FLE	       0x00002000
/* Frame physical error; our favourite pastime */
#define DPAA2_ETH_FAS_FPE	       0x00001000
#define DPAA2_ETH_FAS_PTE	       0x00000080
#define DPAA2_ETH_FAS_ISP	       0x00000040
#define DPAA2_ETH_FAS_PHE	       0x00000020
#define DPAA2_ETH_FAS_BLE	       0x00000010
/* L3 csum validation performed */
#define DPAA2_ETH_FAS_L3CV	      0x00000008
/* L3 csum error */
#define DPAA2_ETH_FAS_L3CE	      0x00000004
/* L4 csum validation performed */
#define DPAA2_ETH_FAS_L4CV	      0x00000002
/* L4 csum error */
#define DPAA2_ETH_FAS_L4CE	      0x00000001

#ifdef __cplusplus
}
#endif

#endif
