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