1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Support for Intel Camera Imaging ISP subsystem.
4 * Copyright (c) 2015, Intel Corporation.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13 * more details.
14 */
15
16#include "tag.h"
17#include <platform_support.h>	/* NULL */
18#include <assert_support.h>
19#include "tag_local.h"
20
21/*
22 * @brief	Creates the tag description from the given parameters.
23 * @param[in]	num_captures
24 * @param[in]	skip
25 * @param[in]	offset
26 * @param[out]	tag_descr
27 */
28void
29sh_css_create_tag_descr(int num_captures,
30			unsigned int skip,
31			int offset,
32			unsigned int exp_id,
33			struct sh_css_tag_descr *tag_descr)
34{
35	assert(tag_descr);
36
37	tag_descr->num_captures = num_captures;
38	tag_descr->skip		= skip;
39	tag_descr->offset	= offset;
40	tag_descr->exp_id	= exp_id;
41}
42
43/*
44 * @brief	Encodes the members of tag description into a 32-bit value.
45 * @param[in]	tag		Pointer to the tag description
46 * @return	(unsigned int)	Encoded 32-bit tag-info
47 */
48unsigned int
49sh_css_encode_tag_descr(struct sh_css_tag_descr *tag)
50{
51	int num_captures;
52	unsigned int num_captures_sign;
53	unsigned int skip;
54	int offset;
55	unsigned int offset_sign;
56	unsigned int exp_id;
57	unsigned int encoded_tag;
58
59	assert(tag);
60
61	if (tag->num_captures < 0) {
62		num_captures = -tag->num_captures;
63		num_captures_sign = 1;
64	} else {
65		num_captures = tag->num_captures;
66		num_captures_sign = 0;
67	}
68	skip = tag->skip;
69	if (tag->offset < 0) {
70		offset = -tag->offset;
71		offset_sign = 1;
72	} else {
73		offset = tag->offset;
74		offset_sign = 0;
75	}
76	exp_id = tag->exp_id;
77
78	if (exp_id != 0) {
79		/* we encode either an exp_id or capture data */
80		assert((num_captures == 0) && (skip == 0) && (offset == 0));
81
82		encoded_tag = TAG_EXP | (exp_id & 0xFF) << TAG_EXP_ID_SHIFT;
83	} else {
84		encoded_tag = TAG_CAP
85			      | ((num_captures_sign & 0x00000001) << TAG_NUM_CAPTURES_SIGN_SHIFT)
86			      | ((offset_sign       & 0x00000001) << TAG_OFFSET_SIGN_SHIFT)
87			      | ((num_captures      & 0x000000FF) << TAG_NUM_CAPTURES_SHIFT)
88			      | ((skip              & 0x000000FF) << TAG_OFFSET_SHIFT)
89			      | ((offset            & 0x000000FF) << TAG_SKIP_SHIFT);
90	}
91	return encoded_tag;
92}
93