/* SPDX-License-Identifier: BSD-3-Clause
 * Copyright(c) 2022 Intel Corporation
 */

#ifndef AFU_PMD_HE_HSSI_H
#define AFU_PMD_HE_HSSI_H

#include "afu_pmd_core.h"
#include "rte_pmd_afu.h"

#ifdef __cplusplus
extern "C" {
#endif

#define HE_HSSI_UUID_L    0xbb370242ac130002
#define HE_HSSI_UUID_H    0x823c334c98bf11ea
#define NUM_HE_HSSI_PORTS 8

/* HE-HSSI registers definition */
#define TRAFFIC_CTRL_CMD    0x30
#define TRAFFIC_CTRL_DATA   0x38
#define TRAFFIC_CTRL_CH_SEL 0x40
#define AFU_SCRATCHPAD      0x48

#define TG_NUM_PKT        0x3c00
#define TG_PKT_LEN_TYPE   0x3c01
#define TG_DATA_PATTERN   0x3c02
#define TG_START_XFR      0x3c03
#define TG_STOP_XFR       0x3c04
#define TG_SRC_MAC_L      0x3c05
#define TG_SRC_MAC_H      0x3c06
#define TG_DST_MAC_L      0x3c07
#define TG_DST_MAC_H      0x3c08
#define TG_PKT_XFRD       0x3c09
#define TG_NUM_RND_SEEDS  3
#define TG_RANDOM_SEED(n) (0x3c0a + (n))
#define TG_PKT_LEN        0x3c0d

#define TM_NUM_PKT        0x3d00
#define TM_PKT_GOOD       0x3d01
#define TM_PKT_BAD        0x3d02
#define TM_BYTE_CNT0      0x3d03
#define TM_BYTE_CNT1      0x3d04
#define TM_AVST_RX_ERR    0x3d07
#define   OVERFLOW_ERR    (1 << 9)
#define   LENGTH_ERR      (1 << 8)
#define   OVERSIZE_ERR    (1 << 7)
#define   UNDERSIZE_ERR   (1 << 6)
#define   MAC_CRC_ERR     (1 << 5)
#define   PHY_ERR         (1 << 4)
#define   ERR_VALID       (1 << 3)

#define LOOPBACK_EN          0x3e00
#define LOOPBACK_FIFO_STATUS 0x3e01
#define   ALMOST_EMPTY    (1 << 1)
#define   ALMOST_FULL     (1 << 0)

#define MAILBOX_TIMEOUT_MS       100
#define MAILBOX_POLL_INTERVAL_MS 10

struct traffic_ctrl_cmd {
	union {
		uint64_t csr;
		struct {
			uint32_t read_cmd:1;
			uint32_t write_cmd:1;
			uint32_t ack_trans:1;
			uint32_t rsvd1:29;
			uint32_t afu_cmd_addr:16;
			uint32_t rsvd2:16;
		};
	};
};

struct traffic_ctrl_data {
	union {
		uint64_t csr;
		struct {
			uint32_t read_data;
			uint32_t write_data;
		};
	};
};

struct traffic_ctrl_ch_sel {
	union {
		uint64_t csr;
		struct {
			uint32_t channel_sel:3;
			uint32_t rsvd1:29;
			uint32_t rsvd2;
		};
	};
};

struct he_hssi_ctx {
	uint8_t *addr;
};

struct he_hssi_priv {
	struct rte_pmd_afu_he_hssi_cfg he_hssi_cfg;
	struct he_hssi_ctx he_hssi_ctx;
};

#ifdef __cplusplus
}
#endif

#endif /* AFU_PMD_HE_HSSI_H */
