125644288SMichael Tretter // SPDX-License-Identifier: GPL-2.0
225644288SMichael Tretter /*
325644288SMichael Tretter  * Copyright (C) 2019-2020 Pengutronix, Michael Tretter <kernel@pengutronix.de>
425644288SMichael Tretter  *
525644288SMichael Tretter  * Helper functions to generate a raw byte sequence payload from values.
625644288SMichael Tretter  */
725644288SMichael Tretter 
825644288SMichael Tretter #include <linux/kernel.h>
925644288SMichael Tretter #include <linux/types.h>
1025644288SMichael Tretter #include <linux/string.h>
1125644288SMichael Tretter #include <linux/v4l2-controls.h>
1225644288SMichael Tretter 
1325644288SMichael Tretter #include <linux/device.h>
1425644288SMichael Tretter #include <linux/export.h>
1525644288SMichael Tretter #include <linux/log2.h>
1625644288SMichael Tretter 
1725644288SMichael Tretter #include "nal-rbsp.h"
1825644288SMichael Tretter 
rbsp_init(struct rbsp * rbsp,void * addr,size_t size,struct nal_rbsp_ops * ops)1925644288SMichael Tretter void rbsp_init(struct rbsp *rbsp, void *addr, size_t size,
2025644288SMichael Tretter 	       struct nal_rbsp_ops *ops)
2125644288SMichael Tretter {
2225644288SMichael Tretter 	if (!rbsp)
2325644288SMichael Tretter 		return;
2425644288SMichael Tretter 
2525644288SMichael Tretter 	rbsp->data = addr;
2625644288SMichael Tretter 	rbsp->size = size;
2725644288SMichael Tretter 	rbsp->pos = 0;
2825644288SMichael Tretter 	rbsp->ops = ops;
2925644288SMichael Tretter 	rbsp->error = 0;
3025644288SMichael Tretter }
3125644288SMichael Tretter 
rbsp_unsupported(struct rbsp * rbsp)32*98c588b6SMichael Tretter void rbsp_unsupported(struct rbsp *rbsp)
33*98c588b6SMichael Tretter {
34*98c588b6SMichael Tretter 	rbsp->error = -EINVAL;
35*98c588b6SMichael Tretter }
36*98c588b6SMichael Tretter 
3725644288SMichael Tretter static int rbsp_read_bits(struct rbsp *rbsp, int n, unsigned int *value);
3825644288SMichael Tretter static int rbsp_write_bits(struct rbsp *rbsp, int n, unsigned int value);
3925644288SMichael Tretter 
4025644288SMichael Tretter /*
4125644288SMichael Tretter  * When reading or writing, the emulation_prevention_three_byte is detected
4225644288SMichael Tretter  * only when the 2 one bits need to be inserted. Therefore, we are not
4325644288SMichael Tretter  * actually adding the 0x3 byte, but the 2 one bits and the six 0 bits of the
4425644288SMichael Tretter  * next byte.
4525644288SMichael Tretter  */
4625644288SMichael Tretter #define EMULATION_PREVENTION_THREE_BYTE (0x3 << 6)
4725644288SMichael Tretter 
add_emulation_prevention_three_byte(struct rbsp * rbsp)4825644288SMichael Tretter static int add_emulation_prevention_three_byte(struct rbsp *rbsp)
4925644288SMichael Tretter {
5025644288SMichael Tretter 	rbsp->num_consecutive_zeros = 0;
5125644288SMichael Tretter 	rbsp_write_bits(rbsp, 8, EMULATION_PREVENTION_THREE_BYTE);
5225644288SMichael Tretter 
5325644288SMichael Tretter 	return 0;
5425644288SMichael Tretter }
5525644288SMichael Tretter 
discard_emulation_prevention_three_byte(struct rbsp * rbsp)5625644288SMichael Tretter static int discard_emulation_prevention_three_byte(struct rbsp *rbsp)
5725644288SMichael Tretter {
5825644288SMichael Tretter 	unsigned int tmp = 0;
5925644288SMichael Tretter 
6025644288SMichael Tretter 	rbsp->num_consecutive_zeros = 0;
6125644288SMichael Tretter 	rbsp_read_bits(rbsp, 8, &tmp);
6225644288SMichael Tretter 	if (tmp != EMULATION_PREVENTION_THREE_BYTE)
6325644288SMichael Tretter 		return -EINVAL;
6425644288SMichael Tretter 
6525644288SMichael Tretter 	return 0;
6625644288SMichael Tretter }
6725644288SMichael Tretter 
rbsp_read_bit(struct rbsp * rbsp)6825644288SMichael Tretter static inline int rbsp_read_bit(struct rbsp *rbsp)
6925644288SMichael Tretter {
7025644288SMichael Tretter 	int shift;
7125644288SMichael Tretter 	int ofs;
7225644288SMichael Tretter 	int bit;
7325644288SMichael Tretter 	int err;
7425644288SMichael Tretter 
7525644288SMichael Tretter 	if (rbsp->num_consecutive_zeros == 22) {
7625644288SMichael Tretter 		err = discard_emulation_prevention_three_byte(rbsp);
7725644288SMichael Tretter 		if (err)
7825644288SMichael Tretter 			return err;
7925644288SMichael Tretter 	}
8025644288SMichael Tretter 
8125644288SMichael Tretter 	shift = 7 - (rbsp->pos % 8);
8225644288SMichael Tretter 	ofs = rbsp->pos / 8;
8325644288SMichael Tretter 	if (ofs >= rbsp->size)
8425644288SMichael Tretter 		return -EINVAL;
8525644288SMichael Tretter 
8625644288SMichael Tretter 	bit = (rbsp->data[ofs] >> shift) & 1;
8725644288SMichael Tretter 
8825644288SMichael Tretter 	rbsp->pos++;
8925644288SMichael Tretter 
9025644288SMichael Tretter 	if (bit == 1 ||
9125644288SMichael Tretter 	    (rbsp->num_consecutive_zeros < 7 && (rbsp->pos % 8 == 0)))
9225644288SMichael Tretter 		rbsp->num_consecutive_zeros = 0;
9325644288SMichael Tretter 	else
9425644288SMichael Tretter 		rbsp->num_consecutive_zeros++;
9525644288SMichael Tretter 
9625644288SMichael Tretter 	return bit;
9725644288SMichael Tretter }
9825644288SMichael Tretter 
rbsp_write_bit(struct rbsp * rbsp,bool value)9925644288SMichael Tretter static inline int rbsp_write_bit(struct rbsp *rbsp, bool value)
10025644288SMichael Tretter {
10125644288SMichael Tretter 	int shift;
10225644288SMichael Tretter 	int ofs;
10325644288SMichael Tretter 
10425644288SMichael Tretter 	if (rbsp->num_consecutive_zeros == 22)
10525644288SMichael Tretter 		add_emulation_prevention_three_byte(rbsp);
10625644288SMichael Tretter 
10725644288SMichael Tretter 	shift = 7 - (rbsp->pos % 8);
10825644288SMichael Tretter 	ofs = rbsp->pos / 8;
10925644288SMichael Tretter 	if (ofs >= rbsp->size)
11025644288SMichael Tretter 		return -EINVAL;
11125644288SMichael Tretter 
11225644288SMichael Tretter 	rbsp->data[ofs] &= ~(1 << shift);
11325644288SMichael Tretter 	rbsp->data[ofs] |= value << shift;
11425644288SMichael Tretter 
11525644288SMichael Tretter 	rbsp->pos++;
11625644288SMichael Tretter 
11725644288SMichael Tretter 	if (value ||
11825644288SMichael Tretter 	    (rbsp->num_consecutive_zeros < 7 && (rbsp->pos % 8 == 0))) {
11925644288SMichael Tretter 		rbsp->num_consecutive_zeros = 0;
12025644288SMichael Tretter 	} else {
12125644288SMichael Tretter 		rbsp->num_consecutive_zeros++;
12225644288SMichael Tretter 	}
12325644288SMichael Tretter 
12425644288SMichael Tretter 	return 0;
12525644288SMichael Tretter }
12625644288SMichael Tretter 
rbsp_read_bits(struct rbsp * rbsp,int n,unsigned int * value)12725644288SMichael Tretter static inline int rbsp_read_bits(struct rbsp *rbsp, int n, unsigned int *value)
12825644288SMichael Tretter {
12925644288SMichael Tretter 	int i;
13025644288SMichael Tretter 	int bit;
13125644288SMichael Tretter 	unsigned int tmp = 0;
13225644288SMichael Tretter 
13325644288SMichael Tretter 	if (n > 8 * sizeof(*value))
13425644288SMichael Tretter 		return -EINVAL;
13525644288SMichael Tretter 
13625644288SMichael Tretter 	for (i = n; i > 0; i--) {
13725644288SMichael Tretter 		bit = rbsp_read_bit(rbsp);
13825644288SMichael Tretter 		if (bit < 0)
13925644288SMichael Tretter 			return bit;
14025644288SMichael Tretter 		tmp |= bit << (i - 1);
14125644288SMichael Tretter 	}
14225644288SMichael Tretter 
14325644288SMichael Tretter 	if (value)
14425644288SMichael Tretter 		*value = tmp;
14525644288SMichael Tretter 
14625644288SMichael Tretter 	return 0;
14725644288SMichael Tretter }
14825644288SMichael Tretter 
rbsp_write_bits(struct rbsp * rbsp,int n,unsigned int value)14925644288SMichael Tretter static int rbsp_write_bits(struct rbsp *rbsp, int n, unsigned int value)
15025644288SMichael Tretter {
15125644288SMichael Tretter 	int ret;
15225644288SMichael Tretter 
15325644288SMichael Tretter 	if (n > 8 * sizeof(value))
15425644288SMichael Tretter 		return -EINVAL;
15525644288SMichael Tretter 
15625644288SMichael Tretter 	while (n--) {
15725644288SMichael Tretter 		ret = rbsp_write_bit(rbsp, (value >> n) & 1);
15825644288SMichael Tretter 		if (ret)
15925644288SMichael Tretter 			return ret;
16025644288SMichael Tretter 	}
16125644288SMichael Tretter 
16225644288SMichael Tretter 	return 0;
16325644288SMichael Tretter }
16425644288SMichael Tretter 
rbsp_read_uev(struct rbsp * rbsp,unsigned int * value)16525644288SMichael Tretter static int rbsp_read_uev(struct rbsp *rbsp, unsigned int *value)
16625644288SMichael Tretter {
16725644288SMichael Tretter 	int leading_zero_bits = 0;
16825644288SMichael Tretter 	unsigned int tmp = 0;
16925644288SMichael Tretter 	int ret;
17025644288SMichael Tretter 
17125644288SMichael Tretter 	while ((ret = rbsp_read_bit(rbsp)) == 0)
17225644288SMichael Tretter 		leading_zero_bits++;
17325644288SMichael Tretter 	if (ret < 0)
17425644288SMichael Tretter 		return ret;
17525644288SMichael Tretter 
17625644288SMichael Tretter 	if (leading_zero_bits > 0) {
17725644288SMichael Tretter 		ret = rbsp_read_bits(rbsp, leading_zero_bits, &tmp);
17825644288SMichael Tretter 		if (ret)
17925644288SMichael Tretter 			return ret;
18025644288SMichael Tretter 	}
18125644288SMichael Tretter 
18225644288SMichael Tretter 	if (value)
18325644288SMichael Tretter 		*value = (1 << leading_zero_bits) - 1 + tmp;
18425644288SMichael Tretter 
18525644288SMichael Tretter 	return 0;
18625644288SMichael Tretter }
18725644288SMichael Tretter 
rbsp_write_uev(struct rbsp * rbsp,unsigned int * value)18825644288SMichael Tretter static int rbsp_write_uev(struct rbsp *rbsp, unsigned int *value)
18925644288SMichael Tretter {
19025644288SMichael Tretter 	int ret;
19125644288SMichael Tretter 	int leading_zero_bits;
19225644288SMichael Tretter 
19325644288SMichael Tretter 	if (!value)
19425644288SMichael Tretter 		return -EINVAL;
19525644288SMichael Tretter 
19625644288SMichael Tretter 	leading_zero_bits = ilog2(*value + 1);
19725644288SMichael Tretter 
19825644288SMichael Tretter 	ret = rbsp_write_bits(rbsp, leading_zero_bits, 0);
19925644288SMichael Tretter 	if (ret)
20025644288SMichael Tretter 		return ret;
20125644288SMichael Tretter 
20225644288SMichael Tretter 	return rbsp_write_bits(rbsp, leading_zero_bits + 1, *value + 1);
20325644288SMichael Tretter }
20425644288SMichael Tretter 
rbsp_read_sev(struct rbsp * rbsp,int * value)20525644288SMichael Tretter static int rbsp_read_sev(struct rbsp *rbsp, int *value)
20625644288SMichael Tretter {
20725644288SMichael Tretter 	int ret;
20825644288SMichael Tretter 	unsigned int tmp;
20925644288SMichael Tretter 
21025644288SMichael Tretter 	ret = rbsp_read_uev(rbsp, &tmp);
21125644288SMichael Tretter 	if (ret)
21225644288SMichael Tretter 		return ret;
21325644288SMichael Tretter 
21425644288SMichael Tretter 	if (value) {
21525644288SMichael Tretter 		if (tmp & 1)
21625644288SMichael Tretter 			*value = (tmp + 1) / 2;
21725644288SMichael Tretter 		else
21825644288SMichael Tretter 			*value = -(tmp / 2);
21925644288SMichael Tretter 	}
22025644288SMichael Tretter 
22125644288SMichael Tretter 	return 0;
22225644288SMichael Tretter }
22325644288SMichael Tretter 
rbsp_write_sev(struct rbsp * rbsp,int * value)22425644288SMichael Tretter static int rbsp_write_sev(struct rbsp *rbsp, int *value)
22525644288SMichael Tretter {
22625644288SMichael Tretter 	unsigned int tmp;
22725644288SMichael Tretter 
22825644288SMichael Tretter 	if (!value)
22925644288SMichael Tretter 		return -EINVAL;
23025644288SMichael Tretter 
23125644288SMichael Tretter 	if (*value > 0)
23225644288SMichael Tretter 		tmp = (2 * (*value)) | 1;
23325644288SMichael Tretter 	else
23425644288SMichael Tretter 		tmp = -2 * (*value);
23525644288SMichael Tretter 
23625644288SMichael Tretter 	return rbsp_write_uev(rbsp, &tmp);
23725644288SMichael Tretter }
23825644288SMichael Tretter 
__rbsp_write_bit(struct rbsp * rbsp,int * value)23925644288SMichael Tretter static int __rbsp_write_bit(struct rbsp *rbsp, int *value)
24025644288SMichael Tretter {
24125644288SMichael Tretter 	return rbsp_write_bit(rbsp, *value);
24225644288SMichael Tretter }
24325644288SMichael Tretter 
__rbsp_write_bits(struct rbsp * rbsp,int n,unsigned int * value)24425644288SMichael Tretter static int __rbsp_write_bits(struct rbsp *rbsp, int n, unsigned int *value)
24525644288SMichael Tretter {
24625644288SMichael Tretter 	return rbsp_write_bits(rbsp, n, *value);
24725644288SMichael Tretter }
24825644288SMichael Tretter 
24925644288SMichael Tretter struct nal_rbsp_ops write = {
25025644288SMichael Tretter 	.rbsp_bit = __rbsp_write_bit,
25125644288SMichael Tretter 	.rbsp_bits = __rbsp_write_bits,
25225644288SMichael Tretter 	.rbsp_uev = rbsp_write_uev,
25325644288SMichael Tretter 	.rbsp_sev = rbsp_write_sev,
25425644288SMichael Tretter };
25525644288SMichael Tretter 
__rbsp_read_bit(struct rbsp * rbsp,int * value)25625644288SMichael Tretter static int __rbsp_read_bit(struct rbsp *rbsp, int *value)
25725644288SMichael Tretter {
25825644288SMichael Tretter 	int tmp = rbsp_read_bit(rbsp);
25925644288SMichael Tretter 
26025644288SMichael Tretter 	if (tmp < 0)
26125644288SMichael Tretter 		return tmp;
26225644288SMichael Tretter 	*value = tmp;
26325644288SMichael Tretter 
26425644288SMichael Tretter 	return 0;
26525644288SMichael Tretter }
26625644288SMichael Tretter 
26725644288SMichael Tretter struct nal_rbsp_ops read = {
26825644288SMichael Tretter 	.rbsp_bit = __rbsp_read_bit,
26925644288SMichael Tretter 	.rbsp_bits = rbsp_read_bits,
27025644288SMichael Tretter 	.rbsp_uev = rbsp_read_uev,
27125644288SMichael Tretter 	.rbsp_sev = rbsp_read_sev,
27225644288SMichael Tretter };
27325644288SMichael Tretter 
rbsp_bit(struct rbsp * rbsp,int * value)27425644288SMichael Tretter void rbsp_bit(struct rbsp *rbsp, int *value)
27525644288SMichael Tretter {
27625644288SMichael Tretter 	if (rbsp->error)
27725644288SMichael Tretter 		return;
27825644288SMichael Tretter 	rbsp->error = rbsp->ops->rbsp_bit(rbsp, value);
27925644288SMichael Tretter }
28025644288SMichael Tretter 
rbsp_bits(struct rbsp * rbsp,int n,int * value)28125644288SMichael Tretter void rbsp_bits(struct rbsp *rbsp, int n, int *value)
28225644288SMichael Tretter {
28325644288SMichael Tretter 	if (rbsp->error)
28425644288SMichael Tretter 		return;
28525644288SMichael Tretter 	rbsp->error = rbsp->ops->rbsp_bits(rbsp, n, value);
28625644288SMichael Tretter }
28725644288SMichael Tretter 
rbsp_uev(struct rbsp * rbsp,unsigned int * value)28825644288SMichael Tretter void rbsp_uev(struct rbsp *rbsp, unsigned int *value)
28925644288SMichael Tretter {
29025644288SMichael Tretter 	if (rbsp->error)
29125644288SMichael Tretter 		return;
29225644288SMichael Tretter 	rbsp->error = rbsp->ops->rbsp_uev(rbsp, value);
29325644288SMichael Tretter }
29425644288SMichael Tretter 
rbsp_sev(struct rbsp * rbsp,int * value)29525644288SMichael Tretter void rbsp_sev(struct rbsp *rbsp, int *value)
29625644288SMichael Tretter {
29725644288SMichael Tretter 	if (rbsp->error)
29825644288SMichael Tretter 		return;
29925644288SMichael Tretter 	rbsp->error = rbsp->ops->rbsp_sev(rbsp, value);
30025644288SMichael Tretter }
30125644288SMichael Tretter 
rbsp_trailing_bits(struct rbsp * rbsp)30225644288SMichael Tretter void rbsp_trailing_bits(struct rbsp *rbsp)
30325644288SMichael Tretter {
30425644288SMichael Tretter 	unsigned int rbsp_stop_one_bit = 1;
30525644288SMichael Tretter 	unsigned int rbsp_alignment_zero_bit = 0;
30625644288SMichael Tretter 
30725644288SMichael Tretter 	rbsp_bit(rbsp, &rbsp_stop_one_bit);
30825644288SMichael Tretter 	rbsp_bits(rbsp, round_up(rbsp->pos, 8) - rbsp->pos,
30925644288SMichael Tretter 		  &rbsp_alignment_zero_bit);
31025644288SMichael Tretter }
311