| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Support for Intel Camera Imaging ISP subsystem. |
| * Copyright (c) 2015, Intel Corporation. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms and conditions of the GNU General Public License, |
| * version 2, as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| */ |
| |
| #include "tag.h" |
| #include <platform_support.h> /* NULL */ |
| #include <assert_support.h> |
| #include "tag_local.h" |
| |
| /* |
| * @brief Creates the tag description from the given parameters. |
| * @param[in] num_captures |
| * @param[in] skip |
| * @param[in] offset |
| * @param[out] tag_descr |
| */ |
| 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) |
| { |
| assert(tag_descr); |
| |
| tag_descr->num_captures = num_captures; |
| tag_descr->skip = skip; |
| tag_descr->offset = offset; |
| tag_descr->exp_id = exp_id; |
| } |
| |
| /* |
| * @brief Encodes the members of tag description into a 32-bit value. |
| * @param[in] tag Pointer to the tag description |
| * @return (unsigned int) Encoded 32-bit tag-info |
| */ |
| unsigned int |
| sh_css_encode_tag_descr(struct sh_css_tag_descr *tag) |
| { |
| int num_captures; |
| unsigned int num_captures_sign; |
| unsigned int skip; |
| int offset; |
| unsigned int offset_sign; |
| unsigned int exp_id; |
| unsigned int encoded_tag; |
| |
| assert(tag); |
| |
| if (tag->num_captures < 0) { |
| num_captures = -tag->num_captures; |
| num_captures_sign = 1; |
| } else { |
| num_captures = tag->num_captures; |
| num_captures_sign = 0; |
| } |
| skip = tag->skip; |
| if (tag->offset < 0) { |
| offset = -tag->offset; |
| offset_sign = 1; |
| } else { |
| offset = tag->offset; |
| offset_sign = 0; |
| } |
| exp_id = tag->exp_id; |
| |
| if (exp_id != 0) { |
| /* we encode either an exp_id or capture data */ |
| assert((num_captures == 0) && (skip == 0) && (offset == 0)); |
| |
| encoded_tag = TAG_EXP | (exp_id & 0xFF) << TAG_EXP_ID_SHIFT; |
| } else { |
| encoded_tag = TAG_CAP |
| | ((num_captures_sign & 0x00000001) << TAG_NUM_CAPTURES_SIGN_SHIFT) |
| | ((offset_sign & 0x00000001) << TAG_OFFSET_SIGN_SHIFT) |
| | ((num_captures & 0x000000FF) << TAG_NUM_CAPTURES_SHIFT) |
| | ((skip & 0x000000FF) << TAG_OFFSET_SHIFT) |
| | ((offset & 0x000000FF) << TAG_SKIP_SHIFT); |
| } |
| return encoded_tag; |
| } |