1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Support for Intel Camera Imaging ISP subsystem.
4 * Copyright (c) 2010 - 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 <linux/bitops.h>
17 #include <linux/math.h>
18
19 #include "ia_css_bayer_io.host.h"
20 #include "dma.h"
21 #ifndef IA_CSS_NO_DEBUG
22 #include "ia_css_debug.h"
23 #endif
24 #include "ia_css_isp_params.h"
25 #include "ia_css_frame.h"
26
ia_css_bayer_io_config(const struct ia_css_binary * binary,const struct sh_css_binary_args * args)27 int ia_css_bayer_io_config(const struct ia_css_binary *binary,
28 const struct sh_css_binary_args *args)
29 {
30 const struct ia_css_frame *in_frame = args->in_frame;
31 const struct ia_css_frame **out_frames = (const struct ia_css_frame **)
32 &args->out_frame;
33 const struct ia_css_frame_info *in_frame_info = ia_css_frame_get_info(in_frame);
34 const unsigned int ddr_elems_per_word =
35 DIV_ROUND_UP(HIVE_ISP_DDR_WORD_BITS, BITS_PER_TYPE(short));
36 unsigned int size_get = 0, size_put = 0;
37 unsigned int offset = 0;
38 int ret;
39
40 if (binary->info->mem_offsets.offsets.param) {
41 size_get = binary->info->mem_offsets.offsets.param->dmem.get.size;
42 offset = binary->info->mem_offsets.offsets.param->dmem.get.offset;
43 }
44
45 if (size_get) {
46 struct ia_css_common_io_config *to = (struct ia_css_common_io_config *)
47 &binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset];
48 struct dma_port_config config;
49 #ifndef IA_CSS_NO_DEBUG
50 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
51 "ia_css_bayer_io_config() get part enter:\n");
52 #endif
53
54 ret = ia_css_dma_configure_from_info(&config, in_frame_info);
55 if (ret)
56 return ret;
57 // The base_address of the input frame will be set in the ISP
58 to->width = in_frame_info->res.width;
59 to->height = in_frame_info->res.height;
60 to->stride = config.stride;
61 to->ddr_elems_per_word = ddr_elems_per_word;
62 #ifndef IA_CSS_NO_DEBUG
63 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
64 "ia_css_bayer_io_config() get part leave:\n");
65 #endif
66 }
67
68 if (binary->info->mem_offsets.offsets.param) {
69 size_put = binary->info->mem_offsets.offsets.param->dmem.put.size;
70 offset = binary->info->mem_offsets.offsets.param->dmem.put.offset;
71 }
72
73 if (size_put) {
74 struct ia_css_common_io_config *to = (struct ia_css_common_io_config *)
75 &binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset];
76 struct dma_port_config config;
77 #ifndef IA_CSS_NO_DEBUG
78 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
79 "ia_css_bayer_io_config() put part enter:\n");
80 #endif
81
82 ret = ia_css_dma_configure_from_info(&config, &out_frames[0]->frame_info);
83 if (ret)
84 return ret;
85 to->base_address = out_frames[0]->data;
86 to->width = out_frames[0]->frame_info.res.width;
87 to->height = out_frames[0]->frame_info.res.height;
88 to->stride = config.stride;
89 to->ddr_elems_per_word = ddr_elems_per_word;
90
91 #ifndef IA_CSS_NO_DEBUG
92 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE,
93 "ia_css_bayer_io_config() put part leave:\n");
94 #endif
95 }
96 return 0;
97 }
98