xref: /rk3399_rockchip-uboot/include/u-boot/lz4.h (revision b3df74d022cabe1eb83c0ddb00affb500f0dd3fe)
1*b3df74d0SJoseph Chen /* SPDX-License-Identifier: GPL-2.0+ */
2*b3df74d0SJoseph Chen /*
3*b3df74d0SJoseph Chen  * Copyright 2019 Google LLC
4*b3df74d0SJoseph Chen  */
5*b3df74d0SJoseph Chen 
6*b3df74d0SJoseph Chen #ifndef __LZ4_H
7*b3df74d0SJoseph Chen #define __LZ4_H
8*b3df74d0SJoseph Chen 
9*b3df74d0SJoseph Chen #define LZ4F_MAGIC 0x184D2204
10*b3df74d0SJoseph Chen 
11*b3df74d0SJoseph Chen struct lz4_frame_header {
12*b3df74d0SJoseph Chen 	u32 magic;
13*b3df74d0SJoseph Chen 	union {
14*b3df74d0SJoseph Chen 		u8 flags;
15*b3df74d0SJoseph Chen 		struct {
16*b3df74d0SJoseph Chen 			u8 reserved0:2;
17*b3df74d0SJoseph Chen 			u8 has_content_checksum:1;
18*b3df74d0SJoseph Chen 			u8 has_content_size:1;
19*b3df74d0SJoseph Chen 			u8 has_block_checksum:1;
20*b3df74d0SJoseph Chen 			u8 independent_blocks:1;
21*b3df74d0SJoseph Chen 			u8 version:2;
22*b3df74d0SJoseph Chen 		};
23*b3df74d0SJoseph Chen 	};
24*b3df74d0SJoseph Chen 	union {
25*b3df74d0SJoseph Chen 		u8 block_descriptor;
26*b3df74d0SJoseph Chen 		struct {
27*b3df74d0SJoseph Chen 			u8 reserved1:4;
28*b3df74d0SJoseph Chen 			u8 max_block_size:3;
29*b3df74d0SJoseph Chen 			u8 reserved2:1;
30*b3df74d0SJoseph Chen 		};
31*b3df74d0SJoseph Chen 	};
32*b3df74d0SJoseph Chen 	/* + u64 content_size iff has_content_size is set */
33*b3df74d0SJoseph Chen 	/* + u8 header_checksum */
34*b3df74d0SJoseph Chen } __packed;
35*b3df74d0SJoseph Chen 
36*b3df74d0SJoseph Chen struct lz4_block_header {
37*b3df74d0SJoseph Chen 	union {
38*b3df74d0SJoseph Chen 		u32 raw;
39*b3df74d0SJoseph Chen 		struct {
40*b3df74d0SJoseph Chen 			u32 size:31;
41*b3df74d0SJoseph Chen 			u32 not_compressed:1;
42*b3df74d0SJoseph Chen 		};
43*b3df74d0SJoseph Chen 	};
44*b3df74d0SJoseph Chen 	/* + size bytes of data */
45*b3df74d0SJoseph Chen 	/* + u32 block_checksum iff has_block_checksum is set */
46*b3df74d0SJoseph Chen } __packed;
47*b3df74d0SJoseph Chen 
48*b3df74d0SJoseph Chen bool lz4_is_valid_header(const unsigned char *h);
49*b3df74d0SJoseph Chen 
50*b3df74d0SJoseph Chen /**
51*b3df74d0SJoseph Chen  * ulz4fn() - Decompress LZ4 data
52*b3df74d0SJoseph Chen  *
53*b3df74d0SJoseph Chen  * @src: Source data to decompress
54*b3df74d0SJoseph Chen  * @srcn: Length of source data
55*b3df74d0SJoseph Chen  * @dst: Destination for uncompressed data
56*b3df74d0SJoseph Chen  * @dstn: Returns length of uncompressed data
57*b3df74d0SJoseph Chen  * @return 0 if OK, -EPROTONOSUPPORT if the magic number or version number are
58*b3df74d0SJoseph Chen  *	not recognised or independent blocks are used, -EINVAL if the reserved
59*b3df74d0SJoseph Chen  *	fields are non-zero, or input is overrun, -EENOBUFS if the destination
60*b3df74d0SJoseph Chen  *	buffer is overrun, -EEPROTO if the compressed data causes an error in
61*b3df74d0SJoseph Chen  *	the decompression algorithm
62*b3df74d0SJoseph Chen  */
63*b3df74d0SJoseph Chen int ulz4fn(const void *src, size_t srcn, void *dst, size_t *dstn);
64*b3df74d0SJoseph Chen 
65*b3df74d0SJoseph Chen #endif
66