dfltcc.h (5231B)
1// SPDX-License-Identifier: Zlib 2#ifndef DFLTCC_H 3#define DFLTCC_H 4 5#include "../zlib_deflate/defutil.h" 6#include <asm/facility.h> 7#include <asm/setup.h> 8 9/* 10 * Tuning parameters. 11 */ 12#define DFLTCC_LEVEL_MASK 0x2 /* DFLTCC compression for level 1 only */ 13#define DFLTCC_LEVEL_MASK_DEBUG 0x3fe /* DFLTCC compression for all levels */ 14#define DFLTCC_BLOCK_SIZE 1048576 15#define DFLTCC_FIRST_FHT_BLOCK_SIZE 4096 16#define DFLTCC_DHT_MIN_SAMPLE_SIZE 4096 17#define DFLTCC_RIBM 0 18 19#define DFLTCC_FACILITY 151 20 21/* 22 * Parameter Block for Query Available Functions. 23 */ 24struct dfltcc_qaf_param { 25 char fns[16]; 26 char reserved1[8]; 27 char fmts[2]; 28 char reserved2[6]; 29}; 30 31static_assert(sizeof(struct dfltcc_qaf_param) == 32); 32 33#define DFLTCC_FMT0 0 34 35/* 36 * Parameter Block for Generate Dynamic-Huffman Table, Compress and Expand. 37 */ 38struct dfltcc_param_v0 { 39 uint16_t pbvn; /* Parameter-Block-Version Number */ 40 uint8_t mvn; /* Model-Version Number */ 41 uint8_t ribm; /* Reserved for IBM use */ 42 unsigned reserved32 : 31; 43 unsigned cf : 1; /* Continuation Flag */ 44 uint8_t reserved64[8]; 45 unsigned nt : 1; /* New Task */ 46 unsigned reserved129 : 1; 47 unsigned cvt : 1; /* Check Value Type */ 48 unsigned reserved131 : 1; 49 unsigned htt : 1; /* Huffman-Table Type */ 50 unsigned bcf : 1; /* Block-Continuation Flag */ 51 unsigned bcc : 1; /* Block Closing Control */ 52 unsigned bhf : 1; /* Block Header Final */ 53 unsigned reserved136 : 1; 54 unsigned reserved137 : 1; 55 unsigned dhtgc : 1; /* DHT Generation Control */ 56 unsigned reserved139 : 5; 57 unsigned reserved144 : 5; 58 unsigned sbb : 3; /* Sub-Byte Boundary */ 59 uint8_t oesc; /* Operation-Ending-Supplemental Code */ 60 unsigned reserved160 : 12; 61 unsigned ifs : 4; /* Incomplete-Function Status */ 62 uint16_t ifl; /* Incomplete-Function Length */ 63 uint8_t reserved192[8]; 64 uint8_t reserved256[8]; 65 uint8_t reserved320[4]; 66 uint16_t hl; /* History Length */ 67 unsigned reserved368 : 1; 68 uint16_t ho : 15; /* History Offset */ 69 uint32_t cv; /* Check Value */ 70 unsigned eobs : 15; /* End-of-block Symbol */ 71 unsigned reserved431: 1; 72 uint8_t eobl : 4; /* End-of-block Length */ 73 unsigned reserved436 : 12; 74 unsigned reserved448 : 4; 75 uint16_t cdhtl : 12; /* Compressed-Dynamic-Huffman Table 76 Length */ 77 uint8_t reserved464[6]; 78 uint8_t cdht[288]; 79 uint8_t reserved[32]; 80 uint8_t csb[1152]; 81}; 82 83static_assert(sizeof(struct dfltcc_param_v0) == 1536); 84 85#define CVT_CRC32 0 86#define CVT_ADLER32 1 87#define HTT_FIXED 0 88#define HTT_DYNAMIC 1 89 90/* 91 * Extension of inflate_state and deflate_state for DFLTCC. 92 */ 93struct dfltcc_state { 94 struct dfltcc_param_v0 param; /* Parameter block */ 95 struct dfltcc_qaf_param af; /* Available functions */ 96 uLong level_mask; /* Levels on which to use DFLTCC */ 97 uLong block_size; /* New block each X bytes */ 98 uLong block_threshold; /* New block after total_in > X */ 99 uLong dht_threshold; /* New block only if avail_in >= X */ 100 char msg[64]; /* Buffer for strm->msg */ 101}; 102 103/* Resides right after inflate_state or deflate_state */ 104#define GET_DFLTCC_STATE(state) ((struct dfltcc_state *)((state) + 1)) 105 106/* External functions */ 107int dfltcc_can_deflate(z_streamp strm); 108int dfltcc_deflate(z_streamp strm, 109 int flush, 110 block_state *result); 111void dfltcc_reset(z_streamp strm, uInt size); 112int dfltcc_can_inflate(z_streamp strm); 113typedef enum { 114 DFLTCC_INFLATE_CONTINUE, 115 DFLTCC_INFLATE_BREAK, 116 DFLTCC_INFLATE_SOFTWARE, 117} dfltcc_inflate_action; 118dfltcc_inflate_action dfltcc_inflate(z_streamp strm, 119 int flush, int *ret); 120static inline int is_dfltcc_enabled(void) 121{ 122return (zlib_dfltcc_support != ZLIB_DFLTCC_DISABLED && 123 test_facility(DFLTCC_FACILITY)); 124} 125 126#define DEFLATE_RESET_HOOK(strm) \ 127 dfltcc_reset((strm), sizeof(deflate_state)) 128 129#define DEFLATE_HOOK dfltcc_deflate 130 131#define DEFLATE_NEED_CHECKSUM(strm) (!dfltcc_can_deflate((strm))) 132 133#define DEFLATE_DFLTCC_ENABLED() is_dfltcc_enabled() 134 135#define INFLATE_RESET_HOOK(strm) \ 136 dfltcc_reset((strm), sizeof(struct inflate_state)) 137 138#define INFLATE_TYPEDO_HOOK(strm, flush) \ 139 if (dfltcc_can_inflate((strm))) { \ 140 dfltcc_inflate_action action; \ 141\ 142 RESTORE(); \ 143 action = dfltcc_inflate((strm), (flush), &ret); \ 144 LOAD(); \ 145 if (action == DFLTCC_INFLATE_CONTINUE) \ 146 break; \ 147 else if (action == DFLTCC_INFLATE_BREAK) \ 148 goto inf_leave; \ 149 } 150 151#define INFLATE_NEED_CHECKSUM(strm) (!dfltcc_can_inflate((strm))) 152 153#define INFLATE_NEED_UPDATEWINDOW(strm) (!dfltcc_can_inflate((strm))) 154 155#endif /* DFLTCC_H */