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 #ifndef __SP_PUBLIC_H_INCLUDED__
17 #define __SP_PUBLIC_H_INCLUDED__
18 
19 #include <type_support.h>
20 #include "system_local.h"
21 
22 typedef struct sp_state_s		sp_state_t;
23 typedef struct sp_stall_s		sp_stall_t;
24 
25 /*! Enable or disable the program complete irq signal of SP[ID]
26 
27  \param	ID[in]				SP identifier
28  \param	cnd[in]				predicate
29 
30  \return none, if(cnd) enable(SP[ID].irq) else disable(SP[ID].irq)
31  */
32 void cnd_sp_irq_enable(
33     const sp_ID_t		ID,
34     const bool			cnd);
35 
36 /*! Read the state of cell SP[ID]
37 
38  \param	ID[in]				SP identifier
39  \param	state[out]			sp state structure
40  \param	stall[out]			isp stall conditions
41 
42  \return none, state = SP[ID].state, stall = SP[ID].stall
43  */
44 void sp_get_state(
45     const sp_ID_t		ID,
46     sp_state_t			*state,
47     sp_stall_t			*stall);
48 
49 /*! Write to the status and control register of SP[ID]
50 
51  \param	ID[in]				SP identifier
52  \param	reg[in]				register index
53  \param value[in]			The data to be written
54 
55  \return none, SP[ID].sc[reg] = value
56  */
57 STORAGE_CLASS_SP_H void sp_ctrl_store(
58     const sp_ID_t		ID,
59     const hrt_address	reg,
60     const hrt_data		value);
61 
62 /*! Read from the status and control register of SP[ID]
63 
64  \param	ID[in]				SP identifier
65  \param	reg[in]				register index
66  \param value[in]			The data to be written
67 
68  \return SP[ID].sc[reg]
69  */
70 STORAGE_CLASS_SP_H hrt_data sp_ctrl_load(
71     const sp_ID_t		ID,
72     const hrt_address	reg);
73 
74 /*! Get the status of a bitfield in the control register of SP[ID]
75 
76  \param	ID[in]				SP identifier
77  \param	reg[in]				register index
78  \param bit[in]				The bit index to be checked
79 
80  \return  (SP[ID].sc[reg] & (1<<bit)) != 0
81  */
82 STORAGE_CLASS_SP_H bool sp_ctrl_getbit(
83     const sp_ID_t		ID,
84     const hrt_address	reg,
85     const unsigned int	bit);
86 
87 /*! Set a bitfield in the control register of SP[ID]
88 
89  \param	ID[in]				SP identifier
90  \param	reg[in]				register index
91  \param bit[in]				The bit index to be set
92 
93  \return none, SP[ID].sc[reg] |= (1<<bit)
94  */
95 STORAGE_CLASS_SP_H void sp_ctrl_setbit(
96     const sp_ID_t		ID,
97     const hrt_address	reg,
98     const unsigned int	bit);
99 
100 /*! Clear a bitfield in the control register of SP[ID]
101 
102  \param	ID[in]				SP identifier
103  \param	reg[in]				register index
104  \param bit[in]				The bit index to be set
105 
106  \return none, SP[ID].sc[reg] &= ~(1<<bit)
107  */
108 STORAGE_CLASS_SP_H void sp_ctrl_clearbit(
109     const sp_ID_t		ID,
110     const hrt_address	reg,
111     const unsigned int	bit);
112 
113 /*! Write to the DMEM of SP[ID]
114 
115  \param	ID[in]				SP identifier
116  \param	addr[in]			the address in DMEM
117  \param data[in]			The data to be written
118  \param size[in]			The size(in bytes) of the data to be written
119 
120  \return none, SP[ID].dmem[addr...addr+size-1] = data
121  */
122 STORAGE_CLASS_SP_H void sp_dmem_store(
123     const sp_ID_t		ID,
124     hrt_address		addr,
125     const void			*data,
126     const size_t		size);
127 
128 /*! Read from the DMEM of SP[ID]
129 
130  \param	ID[in]				SP identifier
131  \param	addr[in]			the address in DMEM
132  \param data[in]			The data to be read
133  \param size[in]			The size(in bytes) of the data to be read
134 
135  \return none, data = SP[ID].dmem[addr...addr+size-1]
136  */
137 STORAGE_CLASS_SP_H void sp_dmem_load(
138     const sp_ID_t		ID,
139     const hrt_address	addr,
140     void			*data,
141     const size_t		size);
142 
143 /*! Write a 8-bit datum to the DMEM of SP[ID]
144 
145  \param	ID[in]				SP identifier
146  \param	addr[in]			the address in DMEM
147  \param data[in]			The data to be written
148  \param size[in]			The size(in bytes) of the data to be written
149 
150  \return none, SP[ID].dmem[addr...addr+size-1] = data
151  */
152 STORAGE_CLASS_SP_H void sp_dmem_store_uint8(
153     const sp_ID_t		ID,
154     hrt_address		addr,
155     const uint8_t		data);
156 
157 /*! Write a 16-bit datum to the DMEM of SP[ID]
158 
159  \param	ID[in]				SP identifier
160  \param	addr[in]			the address in DMEM
161  \param data[in]			The data to be written
162  \param size[in]			The size(in bytes) of the data to be written
163 
164  \return none, SP[ID].dmem[addr...addr+size-1] = data
165  */
166 STORAGE_CLASS_SP_H void sp_dmem_store_uint16(
167     const sp_ID_t		ID,
168     hrt_address		addr,
169     const uint16_t		data);
170 
171 /*! Write a 32-bit datum to the DMEM of SP[ID]
172 
173  \param	ID[in]				SP identifier
174  \param	addr[in]			the address in DMEM
175  \param data[in]			The data to be written
176  \param size[in]			The size(in bytes) of the data to be written
177 
178  \return none, SP[ID].dmem[addr...addr+size-1] = data
179  */
180 STORAGE_CLASS_SP_H void sp_dmem_store_uint32(
181     const sp_ID_t		ID,
182     hrt_address		addr,
183     const uint32_t		data);
184 
185 /*! Load a 8-bit datum from the DMEM of SP[ID]
186 
187  \param	ID[in]				SP identifier
188  \param	addr[in]			the address in DMEM
189  \param data[in]			The data to be read
190  \param size[in]			The size(in bytes) of the data to be read
191 
192  \return none, data = SP[ID].dmem[addr...addr+size-1]
193  */
194 STORAGE_CLASS_SP_H uint8_t sp_dmem_load_uint8(
195     const sp_ID_t		ID,
196     const hrt_address	addr);
197 
198 /*! Load a 16-bit datum from the DMEM of SP[ID]
199 
200  \param	ID[in]				SP identifier
201  \param	addr[in]			the address in DMEM
202  \param data[in]			The data to be read
203  \param size[in]			The size(in bytes) of the data to be read
204 
205  \return none, data = SP[ID].dmem[addr...addr+size-1]
206  */
207 STORAGE_CLASS_SP_H uint16_t sp_dmem_load_uint16(
208     const sp_ID_t		ID,
209     const hrt_address	addr);
210 
211 /*! Load a 32-bit datum from the DMEM of SP[ID]
212 
213  \param	ID[in]				SP identifier
214  \param	addr[in]			the address in DMEM
215  \param data[in]			The data to be read
216  \param size[in]			The size(in bytes) of the data to be read
217 
218  \return none, data = SP[ID].dmem[addr...addr+size-1]
219  */
220 STORAGE_CLASS_SP_H uint32_t sp_dmem_load_uint32(
221     const sp_ID_t		ID,
222     const hrt_address	addr);
223 
224 #endif /* __SP_PUBLIC_H_INCLUDED__ */
225