xref: /dpdk/drivers/net/ark/ark_ddm.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
1540914bcSEd Czeck /* SPDX-License-Identifier: BSD-3-Clause
2540914bcSEd Czeck  * Copyright (c) 2015-2018 Atomic Rules LLC
3cf18d4deSEd Czeck  */
4cf18d4deSEd Czeck 
5cf18d4deSEd Czeck #ifndef _ARK_DDM_H_
6cf18d4deSEd Czeck #define _ARK_DDM_H_
7cf18d4deSEd Czeck 
8cf18d4deSEd Czeck #include <stdint.h>
9cf18d4deSEd Czeck 
10cf18d4deSEd Czeck #include <rte_memory.h>
11cf18d4deSEd Czeck 
12cf18d4deSEd Czeck 
13cf18d4deSEd Czeck /* The DDM or Downstream Data Mover is an internal Arkville hardware
14cf18d4deSEd Czeck  * module for moving packet from host memory to the TX packet streams.
15cf18d4deSEd Czeck  * This module is *not* intended for end-user manipulation, hence
16cf18d4deSEd Czeck  * there is minimal documentation.
17cf18d4deSEd Czeck  */
18cf18d4deSEd Czeck 
199ee9e0d3SEd Czeck /* struct defining Tx meta data --  fixed in FPGA -- 8 bytes */
20*e7750639SAndre Muezerie union __rte_packed_begin ark_tx_meta {
21cf18d4deSEd Czeck 	uint64_t physaddr;
229ee9e0d3SEd Czeck 	struct {
239ee9e0d3SEd Czeck 		uint32_t usermeta0;
249ee9e0d3SEd Czeck 		uint32_t usermeta1;
259ee9e0d3SEd Czeck 	};
269ee9e0d3SEd Czeck 	struct {
27cf18d4deSEd Czeck 		uint16_t data_len;	/* of this MBUF */
28cf18d4deSEd Czeck #define   ARK_DDM_EOP   0x01
29cf18d4deSEd Czeck #define   ARK_DDM_SOP   0x02
309ee9e0d3SEd Czeck 		uint8_t  flags;
319ee9e0d3SEd Czeck 		uint8_t  meta_cnt;
329ee9e0d3SEd Czeck 		uint32_t user1;
33cf18d4deSEd Czeck 	};
34*e7750639SAndre Muezerie } __rte_packed_end;
35cf18d4deSEd Czeck 
36cf18d4deSEd Czeck /*
37cf18d4deSEd Czeck  * DDM core hardware structures
38cf18d4deSEd Czeck  * These are overlay structures to a memory mapped FPGA device.  These
39cf18d4deSEd Czeck  * structs will never be instantiated in ram memory
40cf18d4deSEd Czeck  */
41cf18d4deSEd Czeck #define ARK_DDM_CFG 0x0000
42589876bfSEd Czeck /* Set unique HW ID for hardware version */
4338a4657eSEd Czeck #define ARK_DDM_MODID 0x204d4444
4438a4657eSEd Czeck #define ARK_DDM_MODVER 0x37313232
45589876bfSEd Czeck 
46cf18d4deSEd Czeck struct ark_ddm_cfg_t {
4738a4657eSEd Czeck 	union {
4838a4657eSEd Czeck 		char id[4];
4938a4657eSEd Czeck 		uint32_t idnum;
5038a4657eSEd Czeck 	};
5138a4657eSEd Czeck 	union {
5238a4657eSEd Czeck 		char ver[4];
5338a4657eSEd Czeck 		uint32_t vernum;
54cf18d4deSEd Czeck 		volatile uint32_t tlp_stats_clear;
5538a4657eSEd Czeck 	};
5638a4657eSEd Czeck 	uint32_t r0;
57cf18d4deSEd Czeck 	volatile uint32_t tag_max;
58cf18d4deSEd Czeck 	volatile uint32_t command;
5938a4657eSEd Czeck 	uint32_t write_index_interval;	/* 4ns each */
6038a4657eSEd Czeck 	volatile uint64_t qflow;
61cf18d4deSEd Czeck };
62cf18d4deSEd Czeck 
63cf18d4deSEd Czeck #define ARK_DDM_STATS 0x0020
64cf18d4deSEd Czeck struct ark_ddm_stats_t {
65cf18d4deSEd Czeck 	volatile uint64_t tx_byte_count;
66cf18d4deSEd Czeck 	volatile uint64_t tx_pkt_count;
67cf18d4deSEd Czeck 	volatile uint64_t tx_mbuf_count;
68cf18d4deSEd Czeck };
69cf18d4deSEd Czeck 
70cf18d4deSEd Czeck #define ARK_DDM_QUEUE_STATS 0x00a8
71cf18d4deSEd Czeck struct ark_ddm_qstats_t {
72cf18d4deSEd Czeck 	volatile uint64_t byte_count;
73cf18d4deSEd Czeck 	volatile uint64_t pkt_count;
74cf18d4deSEd Czeck 	volatile uint64_t mbuf_count;
75cf18d4deSEd Czeck };
76cf18d4deSEd Czeck 
77cf18d4deSEd Czeck #define ARK_DDM_SETUP  0x00e0
78cf18d4deSEd Czeck struct ark_ddm_setup_t {
79df6e0a06SSantosh Shukla 	rte_iova_t cons_write_index_addr;
8038a4657eSEd Czeck 	volatile uint32_t qcommand;
81cf18d4deSEd Czeck 	volatile uint32_t cons_index;
82cf18d4deSEd Czeck };
83cf18d4deSEd Czeck 
84cf18d4deSEd Czeck #define ARK_DDM_EXPECTED_SIZE 256
85cf18d4deSEd Czeck #define ARK_DDM_QOFFSET ARK_DDM_EXPECTED_SIZE
86cf18d4deSEd Czeck /*  Consolidated structure */
87cf18d4deSEd Czeck struct ark_ddm_t {
88cf18d4deSEd Czeck 	struct ark_ddm_cfg_t cfg;
89cf18d4deSEd Czeck 	uint8_t reserved0[(ARK_DDM_STATS - ARK_DDM_CFG) -
90cf18d4deSEd Czeck 			  sizeof(struct ark_ddm_cfg_t)];
9138a4657eSEd Czeck 
92cf18d4deSEd Czeck 	struct ark_ddm_stats_t stats;
9338a4657eSEd Czeck 	uint8_t reserved1[(ARK_DDM_QUEUE_STATS - ARK_DDM_STATS) -
94cf18d4deSEd Czeck 			  sizeof(struct ark_ddm_stats_t)];
9538a4657eSEd Czeck 
96cf18d4deSEd Czeck 	struct ark_ddm_qstats_t queue_stats;
9738a4657eSEd Czeck 	uint8_t reserved5[(ARK_DDM_SETUP - ARK_DDM_QUEUE_STATS) -
9838a4657eSEd Czeck 			  sizeof(struct ark_ddm_qstats_t)];
9938a4657eSEd Czeck 
100cf18d4deSEd Czeck 	struct ark_ddm_setup_t setup;
101cf18d4deSEd Czeck 	uint8_t reserved_p[(ARK_DDM_EXPECTED_SIZE - ARK_DDM_SETUP) -
102cf18d4deSEd Czeck 			   sizeof(struct ark_ddm_setup_t)];
103cf18d4deSEd Czeck };
104cf18d4deSEd Czeck 
105cf18d4deSEd Czeck /* DDM function prototype */
106cf18d4deSEd Czeck int ark_ddm_verify(struct ark_ddm_t *ddm);
107cf18d4deSEd Czeck void ark_ddm_stats_reset(struct ark_ddm_t *ddm);
10838a4657eSEd Czeck void ark_ddm_queue_setup(struct ark_ddm_t *ddm, rte_iova_t cons_addr);
109cf18d4deSEd Czeck void ark_ddm_dump_stats(struct ark_ddm_t *ddm, const char *msg);
110cf18d4deSEd Czeck uint64_t ark_ddm_queue_byte_count(struct ark_ddm_t *ddm);
111cf18d4deSEd Czeck uint64_t ark_ddm_queue_pkt_count(struct ark_ddm_t *ddm);
112cf18d4deSEd Czeck void ark_ddm_queue_reset_stats(struct ark_ddm_t *ddm);
11338a4657eSEd Czeck void ark_ddm_queue_enable(struct ark_ddm_t *ddm, int enable);
114cf18d4deSEd Czeck 
115cf18d4deSEd Czeck #endif
116