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 */
28 void
sh_css_create_tag_descr(int num_captures,unsigned int skip,int offset,unsigned int exp_id,struct sh_css_tag_descr * tag_descr)29 sh_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 */
48 unsigned int
sh_css_encode_tag_descr(struct sh_css_tag_descr * tag)49 sh_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