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