/* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2018 Cavium, Inc */ #ifndef _RTE_OCTEONTX_ZIP_REGS_H_ #define _RTE_OCTEONTX_ZIP_REGS_H_ /** * Enumeration zip_cc * * ZIP compression coding Enumeration * Enumerates ZIP_INST_S[CC]. */ enum zip_cc { ZIP_CC_DEFAULT = 0, ZIP_CC_DYN_HUFF, ZIP_CC_FIXED_HUFF, ZIP_CC_LZS }; /** * Register (NCB) zip_vq#_ena * * ZIP VF Queue Enable Register * If a queue is disabled, ZIP CTL stops fetching instructions from the queue. */ typedef union { uint64_t u; struct zip_vqx_ena_s { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ uint64_t reserved_1_63 : 63; uint64_t ena : 1; #else /* Word 0 - Little Endian */ uint64_t ena : 1; uint64_t reserved_1_63 : 63; #endif /* Word 0 - End */ } s; /* struct zip_vqx_ena_s cn; */ } zip_vqx_ena_t; /** * Register (NCB) zip_vq#_sbuf_addr * * ZIP VF Queue Starting Buffer Address Registers * These registers set the buffer parameters for the instruction queues. * When quiescent (i.e. * outstanding doorbell count is 0), it is safe to rewrite this register * to effectively reset the * command buffer state machine. * These registers must be programmed after software programs the * corresponding ZIP_QUE()_SBUF_CTL. */ typedef union { uint64_t u; struct zip_vqx_sbuf_addr_s { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ uint64_t reserved_49_63 : 15; uint64_t ptr : 42; uint64_t off : 7; #else /* Word 0 - Little Endian */ uint64_t off : 7; uint64_t ptr : 42; uint64_t reserved_49_63 : 15; #endif /* Word 0 - End */ } s; /* struct zip_vqx_sbuf_addr_s cn; */ } zip_vqx_sbuf_addr_t; /** * Register (NCB) zip_que#_doorbell * * ZIP Queue Doorbell Registers * Doorbells for the ZIP instruction queues. */ typedef union { uint64_t u; struct zip_quex_doorbell_s { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ uint64_t reserved_20_63 : 44; uint64_t dbell_cnt : 20; #else /* Word 0 - Little Endian */ uint64_t dbell_cnt : 20; uint64_t reserved_20_63 : 44; #endif /* Word 0 - End */ } s; /* struct zip_quex_doorbell_s cn; */ } zip_quex_doorbell_t; /** * Structure zip_nptr_s * * ZIP Instruction Next-Chunk-Buffer Pointer (NPTR) Structure * This structure is used to chain all the ZIP instruction buffers * together. ZIP instruction buffers are managed * (allocated and released) by software. */ union zip_nptr_s { uint64_t u; struct zip_nptr_s_s { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ uint64_t addr : 64; #else /* Word 0 - Little Endian */ uint64_t addr : 64; #endif /* Word 0 - End */ } s; /* struct zip_nptr_s_s cn83xx; */ }; /** * generic ptr address */ union zip_zptr_addr_s { /** This field can be used to set/clear all bits, or do bitwise * operations over the entire structure. */ uint64_t u; /** generic ptr address */ struct { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ uint64_t addr : 64; #else /* Word 0 - Little Endian */ uint64_t addr : 64; #endif /* Word 0 - End */ } s; }; /** * generic ptr ctl */ union zip_zptr_ctl_s { /** This field can be used to set/clear all bits, or do bitwise * operations over the entire structure. */ uint64_t u; /** generic ptr ctl */ struct { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 1 - Big Endian */ uint64_t reserved_112_127 : 16; uint64_t length : 16; uint64_t reserved_67_95 : 29; uint64_t fw : 1; uint64_t nc : 1; uint64_t data_be : 1; #else /* Word 1 - Little Endian */ uint64_t data_be : 1; uint64_t nc : 1; uint64_t fw : 1; uint64_t reserved_67_95 : 29; uint64_t length : 16; uint64_t reserved_112_127 : 16; #endif /* Word 1 - End */ } s; }; /** * Structure zip_inst_s * * ZIP Instruction Structure * Each ZIP instruction has 16 words (they are called IWORD0 to IWORD15 * within the structure). */ union zip_inst_s { /** This field can be used to set/clear all bits, or do bitwise * operations over the entire structure. */ uint64_t u[16]; /** ZIP Instruction Structure */ struct zip_inst_s_s { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ /** Done interrupt */ uint64_t doneint : 1; /** reserved */ uint64_t reserved_56_62 : 7; /** Total output length */ uint64_t totaloutputlength : 24; /** reserved */ uint64_t reserved_27_31 : 5; /** EXNUM */ uint64_t exn : 3; /** HASH IV */ uint64_t iv : 1; /** EXBITS */ uint64_t exbits : 7; /** Hash more-in-file */ uint64_t hmif : 1; /** Hash Algorithm and enable */ uint64_t halg : 3; /** Sync flush*/ uint64_t sf : 1; /** Compression speed/storage */ uint64_t ss : 2; /** Compression coding */ uint64_t cc : 2; /** End of input data */ uint64_t ef : 1; /** Beginning of file */ uint64_t bf : 1; // uint64_t reserved_3_4 : 2; /** Comp/decomp operation */ uint64_t op : 2; /** Data sactter */ uint64_t ds : 1; /** Data gather */ uint64_t dg : 1; /** History gather */ uint64_t hg : 1; #else /* Word 0 - Little Endian */ uint64_t hg : 1; uint64_t dg : 1; uint64_t ds : 1; //uint64_t reserved_3_4 : 2; uint64_t op : 2; uint64_t bf : 1; uint64_t ef : 1; uint64_t cc : 2; uint64_t ss : 2; uint64_t sf : 1; uint64_t halg : 3; uint64_t hmif : 1; uint64_t exbits : 7; uint64_t iv : 1; uint64_t exn : 3; uint64_t reserved_27_31 : 5; uint64_t totaloutputlength : 24; uint64_t reserved_56_62 : 7; uint64_t doneint : 1; #endif /* Word 0 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 1 - Big Endian */ /** History length */ uint64_t historylength : 16; /** reserved */ uint64_t reserved_96_111 : 16; /** adler/crc32 checksum*/ uint64_t adlercrc32 : 32; #else /* Word 1 - Little Endian */ uint64_t adlercrc32 : 32; uint64_t reserved_96_111 : 16; uint64_t historylength : 16; #endif /* Word 1 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 2 - Big Endian */ /** Decompression Context Pointer Address */ union zip_zptr_addr_s ctx_ptr_addr; #else /* Word 2 - Little Endian */ union zip_zptr_addr_s ctx_ptr_addr; #endif /* Word 2 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Decompression Context Pointer Control */ union zip_zptr_ctl_s ctx_ptr_ctl; #else /* Word 3 - Little Endian */ union zip_zptr_ctl_s ctx_ptr_ctl; #endif /* Word 3 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Decompression history pointer address */ union zip_zptr_addr_s his_ptr_addr; #else /* Word 4 - Little Endian */ union zip_zptr_addr_s his_ptr_addr; #endif /* Word 4 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Decompression history pointer control */ union zip_zptr_ctl_s his_ptr_ctl; #else /* Word 5 - Little Endian */ union zip_zptr_ctl_s his_ptr_ctl; #endif /* Word 5 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Input and compression history pointer address */ union zip_zptr_addr_s inp_ptr_addr; #else /* Word 6 - Little Endian */ union zip_zptr_addr_s inp_ptr_addr; #endif /* Word 6 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Input and compression history pointer control */ union zip_zptr_ctl_s inp_ptr_ctl; #else /* Word 7 - Little Endian */ union zip_zptr_ctl_s inp_ptr_ctl; #endif /* Word 7 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Output pointer address */ union zip_zptr_addr_s out_ptr_addr; #else /* Word 8 - Little Endian */ union zip_zptr_addr_s out_ptr_addr; #endif /* Word 8 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Output pointer control */ union zip_zptr_ctl_s out_ptr_ctl; #else /* Word 9 - Little Endian */ union zip_zptr_ctl_s out_ptr_ctl; #endif /* Word 9 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Result pointer address */ union zip_zptr_addr_s res_ptr_addr; #else /* Word 10 - Little Endian */ union zip_zptr_addr_s res_ptr_addr; #endif /* Word 10 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Result pointer control */ union zip_zptr_ctl_s res_ptr_ctl; #else /* Word 11 - Little Endian */ union zip_zptr_ctl_s res_ptr_ctl; #endif /* Word 11 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 12 - Big Endian */ /** reserved */ uint64_t reserved_812_831 : 20; /** SSO guest group */ uint64_t ggrp : 10; /** SSO tag type */ uint64_t tt : 2; /** SSO tag */ uint64_t tag : 32; #else /* Word 12 - Little Endian */ uint64_t tag : 32; uint64_t tt : 2; uint64_t ggrp : 10; uint64_t reserved_812_831 : 20; #endif /* Word 12 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 13 - Big Endian */ /** Work queue entry pointer */ uint64_t wq_ptr : 64; #else /* Word 13 - Little Endian */ uint64_t wq_ptr : 64; #endif /* Word 13 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** reserved */ uint64_t reserved_896_959 : 64; #else /* Word 14 - Little Endian */ uint64_t reserved_896_959 : 64; #endif /* Word 14 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /** Hash structure pointer */ uint64_t hash_ptr : 64; #else /* Word 15 - Little Endian */ uint64_t hash_ptr : 64; #endif /* Word 15 - End */ } /** ZIP 88xx Instruction Structure */zip88xx; /** ZIP Instruction Structure */ struct zip_inst_s_cn83xx { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ /** Done interrupt */ uint64_t doneint : 1; /** reserved */ uint64_t reserved_56_62 : 7; /** Total output length */ uint64_t totaloutputlength : 24; /** reserved */ uint64_t reserved_27_31 : 5; /** EXNUM */ uint64_t exn : 3; /** HASH IV */ uint64_t iv : 1; /** EXBITS */ uint64_t exbits : 7; /** Hash more-in-file */ uint64_t hmif : 1; /** Hash Algorithm and enable */ uint64_t halg : 3; /** Sync flush*/ uint64_t sf : 1; /** Compression speed/storage */ uint64_t ss : 2; /** Compression coding */ uint64_t cc : 2; /** End of input data */ uint64_t ef : 1; /** Beginning of file */ uint64_t bf : 1; /** Comp/decomp operation */ uint64_t op : 2; /** Data sactter */ uint64_t ds : 1; /** Data gather */ uint64_t dg : 1; /** History gather */ uint64_t hg : 1; #else /* Word 0 - Little Endian */ uint64_t hg : 1; uint64_t dg : 1; uint64_t ds : 1; uint64_t op : 2; uint64_t bf : 1; uint64_t ef : 1; uint64_t cc : 2; uint64_t ss : 2; uint64_t sf : 1; uint64_t halg : 3; uint64_t hmif : 1; uint64_t exbits : 7; uint64_t iv : 1; uint64_t exn : 3; uint64_t reserved_27_31 : 5; uint64_t totaloutputlength : 24; uint64_t reserved_56_62 : 7; uint64_t doneint : 1; #endif /* Word 0 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 1 - Big Endian */ /** History length */ uint64_t historylength : 16; /** reserved */ uint64_t reserved_96_111 : 16; /** adler/crc32 checksum*/ uint64_t adlercrc32 : 32; #else /* Word 1 - Little Endian */ uint64_t adlercrc32 : 32; uint64_t reserved_96_111 : 16; uint64_t historylength : 16; #endif /* Word 1 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 2 - Big Endian */ /** Decompression Context Pointer Address */ union zip_zptr_addr_s ctx_ptr_addr; #else /* Word 2 - Little Endian */ union zip_zptr_addr_s ctx_ptr_addr; #endif /* Word 2 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 3 - Big Endian */ /** Decompression Context Pointer Control */ union zip_zptr_ctl_s ctx_ptr_ctl; #else /* Word 3 - Little Endian */ union zip_zptr_ctl_s ctx_ptr_ctl; #endif /* Word 3 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 4 - Big Endian */ /** Decompression history pointer address */ union zip_zptr_addr_s his_ptr_addr; #else /* Word 4 - Little Endian */ union zip_zptr_addr_s his_ptr_addr; #endif /* Word 4 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 5 - Big Endian */ /** Decompression history pointer control */ union zip_zptr_ctl_s his_ptr_ctl; #else /* Word 5 - Little Endian */ union zip_zptr_ctl_s his_ptr_ctl; #endif /* Word 5 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 6 - Big Endian */ /** Input and compression history pointer address */ union zip_zptr_addr_s inp_ptr_addr; #else /* Word 6 - Little Endian */ union zip_zptr_addr_s inp_ptr_addr; #endif /* Word 6 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 7 - Big Endian */ /** Input and compression history pointer control */ union zip_zptr_ctl_s inp_ptr_ctl; #else /* Word 7 - Little Endian */ union zip_zptr_ctl_s inp_ptr_ctl; #endif /* Word 7 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 8 - Big Endian */ /** Output pointer address */ union zip_zptr_addr_s out_ptr_addr; #else /* Word 8 - Little Endian */ union zip_zptr_addr_s out_ptr_addr; #endif /* Word 8 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 9 - Big Endian */ /** Output pointer control */ union zip_zptr_ctl_s out_ptr_ctl; #else /* Word 9 - Little Endian */ union zip_zptr_ctl_s out_ptr_ctl; #endif /* Word 9 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 10 - Big Endian */ /** Result pointer address */ union zip_zptr_addr_s res_ptr_addr; #else /* Word 10 - Little Endian */ union zip_zptr_addr_s res_ptr_addr; #endif /* Word 10 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 11 - Big Endian */ /** Result pointer control */ union zip_zptr_ctl_s res_ptr_ctl; #else /* Word 11 - Little Endian */ union zip_zptr_ctl_s res_ptr_ctl; #endif /* Word 11 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 12 - Big Endian */ /** reserved */ uint64_t reserved_812_831 : 20; /** SSO guest group */ uint64_t ggrp : 10; /** SSO tag type */ uint64_t tt : 2; /** SSO tag */ uint64_t tag : 32; #else /* Word 12 - Little Endian */ uint64_t tag : 32; uint64_t tt : 2; uint64_t ggrp : 10; uint64_t reserved_812_831 : 20; #endif /* Word 12 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 13 - Big Endian */ /** Work queue entry pointer */ uint64_t wq_ptr : 64; #else /* Word 13 - Little Endian */ uint64_t wq_ptr : 64; #endif /* Word 13 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 14 - Big Endian */ /** reserved */ uint64_t reserved_896_959 : 64; #else /* Word 14 - Little Endian */ uint64_t reserved_896_959 : 64; #endif /* Word 14 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 15 - Big Endian */ /** Hash structure pointer */ uint64_t hash_ptr : 64; #else /* Word 15 - Little Endian */ uint64_t hash_ptr : 64; #endif /* Word 15 - End */ } /** ZIP 83xx Instruction Structure */s; }; /** * Structure zip_zres_s * * ZIP Result Structure * The ZIP coprocessor writes the result structure after it completes the * invocation. The result structure is exactly 24 bytes, and each invocation * of the ZIP coprocessor produces exactly one result structure. */ union zip_zres_s { /** This field can be used to set/clear all bits, or do bitwise * operations over the entire structure. */ uint64_t u[8]; /** ZIP Result Structure */ struct zip_zres_s_s { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ /** crc32 checksum of uncompressed stream */ uint64_t crc32 : 32; /** adler32 checksum of uncompressed stream*/ uint64_t adler32 : 32; #else /* Word 0 - Little Endian */ uint64_t adler32 : 32; uint64_t crc32 : 32; #endif /* Word 0 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 1 - Big Endian */ /** Total numer of Bytes produced in output stream */ uint64_t totalbyteswritten : 32; /** Total number of bytes processed from the input stream */ uint64_t totalbytesread : 32; #else /* Word 1 - Little Endian */ uint64_t totalbytesread : 32; uint64_t totalbyteswritten : 32; #endif /* Word 1 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 2 - Big Endian */ /** Total number of compressed input bits * consumed to decompress all blocks in the file */ uint64_t totalbitsprocessed : 32; /** Done interrupt*/ uint64_t doneint : 1; /** reserved */ uint64_t reserved_155_158 : 4; /** EXNUM */ uint64_t exn : 3; /** reserved */ uint64_t reserved_151 : 1; /** EXBITS */ uint64_t exbits : 7; /** reserved */ uint64_t reserved_137_143 : 7; /** End of file */ uint64_t ef : 1; /** Completion/error code */ uint64_t compcode : 8; #else /* Word 2 - Little Endian */ uint64_t compcode : 8; uint64_t ef : 1; uint64_t reserved_137_143 : 7; uint64_t exbits : 7; uint64_t reserved_151 : 1; uint64_t exn : 3; uint64_t reserved_155_158 : 4; uint64_t doneint : 1; uint64_t totalbitsprocessed : 32; #endif /* Word 2 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 3 - Big Endian */ /** reserved */ uint64_t reserved_253_255 : 3; /** Hash length in bytes */ uint64_t hshlen : 61; #else /* Word 3 - Little Endian */ uint64_t hshlen : 61; uint64_t reserved_253_255 : 3; #endif /* Word 3 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 4 - Big Endian */ /** Double-word 0 of computed hash */ uint64_t hash0 : 64; #else /* Word 4 - Little Endian */ uint64_t hash0 : 64; #endif /* Word 4 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 5 - Big Endian */ /** Double-word 1 of computed hash */ uint64_t hash1 : 64; #else /* Word 5 - Little Endian */ uint64_t hash1 : 64; #endif /* Word 5 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 6 - Big Endian */ /** Double-word 2 of computed hash */ uint64_t hash2 : 64; #else /* Word 6 - Little Endian */ uint64_t hash2 : 64; #endif /* Word 6 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 7 - Big Endian */ /** Double-word 3 of computed hash */ uint64_t hash3 : 64; #else /* Word 7 - Little Endian */ uint64_t hash3 : 64; #endif /* Word 7 - End */ } /** ZIP Result Structure */s; /* struct zip_zres_s_s cn83xx; */ }; /** * Structure zip_zptr_s * * ZIP Generic Pointer Structure * This structure is the generic format of pointers in ZIP_INST_S. */ union zip_zptr_s { /** This field can be used to set/clear all bits, or do bitwise * operations over the entire structure. */ uint64_t u[2]; /** ZIP Generic Pointer Structure */ struct zip_zptr_s_s { #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */ /** Pointer to Data or scatter-gather list */ uint64_t addr : 64; #else /* Word 0 - Little Endian */ uint64_t addr : 64; #endif /* Word 0 - End */ #if defined(__BIG_ENDIAN_BITFIELD) /* Word 1 - Big Endian */ /** reserved */ uint64_t reserved_112_127 : 16; /** Length of Data or scatter-gather list*/ uint64_t length : 16; /** reserved */ uint64_t reserved_67_95 : 29; /** Full-block write */ uint64_t fw : 1; /** No cache allocation */ uint64_t nc : 1; /** reserved */ uint64_t data_be : 1; #else /* Word 1 - Little Endian */ uint64_t data_be : 1; uint64_t nc : 1; uint64_t fw : 1; uint64_t reserved_67_95 : 29; uint64_t length : 16; uint64_t reserved_112_127 : 16; #endif /* Word 1 - End */ } /** ZIP Generic Pointer Structure */s; }; /** * Enumeration zip_comp_e * * ZIP Completion Enumeration * Enumerates the values of ZIP_ZRES_S[COMPCODE]. */ #define ZIP_COMP_E_NOTDONE (0) #define ZIP_COMP_E_SUCCESS (1) #define ZIP_COMP_E_DTRUNC (2) #define ZIP_COMP_E_DSTOP (3) #define ZIP_COMP_E_ITRUNC (4) #define ZIP_COMP_E_RBLOCK (5) #define ZIP_COMP_E_NLEN (6) #define ZIP_COMP_E_BADCODE (7) #define ZIP_COMP_E_BADCODE2 (8) #define ZIP_COMP_E_ZERO_LEN (9) #define ZIP_COMP_E_PARITY (0xa) #define ZIP_COMP_E_FATAL (0xb) #define ZIP_COMP_E_TIMEOUT (0xc) #define ZIP_COMP_E_INSTR_ERR (0xd) #define ZIP_COMP_E_HCTX_ERR (0xe) #define ZIP_COMP_E_STOP (3) /** * Enumeration zip_op_e * * ZIP Operation Enumeration * Enumerates ZIP_INST_S[OP]. * Internal: */ #define ZIP_OP_E_DECOMP (0) #define ZIP_OP_E_NOCOMP (1) #define ZIP_OP_E_COMP (2) /** * Enumeration zip compression levels * * ZIP Compression Level Enumeration * Enumerates ZIP_INST_S[SS]. * Internal: */ #define ZIP_COMP_E_LEVEL_MAX (0) #define ZIP_COMP_E_LEVEL_MED (1) #define ZIP_COMP_E_LEVEL_LOW (2) #define ZIP_COMP_E_LEVEL_MIN (3) #endif /* _RTE_ZIP_REGS_H_ */