xref: /linux/drivers/media/platform/rockchip/rkvdec/rkvdec-bitwriter.h (revision b2128290c29902315e632ea59e0504d6bc9e9b42)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Rockchip Video Decoder bit writer
4  *
5  * Copyright (C) 2026 Collabora, Ltd.
6  *	Detlev Casanova <detlev.casanova@collabora.com>
7  * Copyright (C) 2019 Collabora, Ltd.
8  *	Boris Brezillon <boris.brezillon@collabora.com>
9  */
10 
11 #ifndef RKVDEC_BIT_WRITER_H_
12 #define RKVDEC_BIT_WRITER_H_
13 
14 #include <linux/types.h>
15 #include <linux/bits.h>
16 
17 struct rkvdec_bw_field {
18 	u16 offset;
19 	u8 len;
20 };
21 
22 #define BW_FIELD(_offset, _len) ((struct rkvdec_bw_field){ _offset, _len })
23 
24 static inline void rkvdec_set_bw_field(u32 *buf, struct rkvdec_bw_field field, u32 value)
25 {
26 	u8 bit = field.offset % 32;
27 	u16 word = field.offset / 32;
28 	u64 mask = GENMASK_ULL(bit + field.len - 1, bit);
29 	u64 val = ((u64)value << bit) & mask;
30 
31 	buf[word] &= ~mask;
32 	buf[word] |= val;
33 	if (bit + field.len > 32) {
34 		buf[word + 1] &= ~(mask >> 32);
35 		buf[word + 1] |= val >> 32;
36 	}
37 }
38 
39 #endif /* RKVDEC_BIT_WRITER_H_ */
40