1/* SPDX-License-Identifier: GPL-2.0 */
2/**
3Support for Intel Camera Imaging ISP subsystem.
4Copyright (c) 2010 - 2015, Intel Corporation.
5
6This program is free software; you can redistribute it and/or modify it
7under the terms and conditions of the GNU General Public License,
8version 2, as published by the Free Software Foundation.
9
10This program is distributed in the hope it will be useful, but WITHOUT
11ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13more details.
14*/
15
16#ifndef __DEVICE_ACCESS_H_INCLUDED__
17#define __DEVICE_ACCESS_H_INCLUDED__
18
19/*!
20 * \brief
21 * Define the public interface for physical system
22 * access functions to SRAM and registers. Access
23 * types are limited to those defined in <stdint.h>
24 * All accesses are aligned
25 *
26 * The address representation is private to the system
27 * and represented as/stored in "hrt_address".
28 *
29 * The system global address can differ by an offset;
30 * The device base address. This offset must be added
31 * by the implementation of the access function
32 *
33 * "store" is a transfer to the device
34 * "load" is a transfer from the device
35 */
36
37#include <type_support.h>
38
39/*
40 * User provided file that defines the system address types:
41 *	- hrt_address	a type that can hold the (sub)system address range
42 */
43#include "system_local.h"
44/*
45 * We cannot assume that the global system address size is the size of
46 * a pointer because a (say) 64-bit host can be simulated in a 32-bit
47 * environment. Only if the host environment is modelled as on the target
48 * we could use a pointer. Even then, prototyping may need to be done
49 * before the target environment is available. AS we cannot wait for that
50 * we are stuck with integer addresses
51 */
52
53/*typedef	char *sys_address;*/
54typedef	hrt_address		sys_address;
55
56/*! Set the (sub)system base address
57
58 \param	base_addr[in]		The offset on which the (sub)system is located
59							in the global address map
60
61 \return none,
62 */
63void device_set_base_address(
64    const sys_address		base_addr);
65
66/*! Get the (sub)system base address
67
68 \return base_address,
69 */
70sys_address device_get_base_address(void);
71
72/*! Read an 8-bit value from a device register or memory in the device
73
74 \param	addr[in]			Local address
75
76 \return device[addr]
77 */
78uint8_t ia_css_device_load_uint8(
79    const hrt_address		addr);
80
81/*! Read a 16-bit value from a device register or memory in the device
82
83 \param	addr[in]			Local address
84
85 \return device[addr]
86 */
87uint16_t ia_css_device_load_uint16(
88    const hrt_address		addr);
89
90/*! Read a 32-bit value from a device register or memory in the device
91
92 \param	addr[in]			Local address
93
94 \return device[addr]
95 */
96uint32_t ia_css_device_load_uint32(
97    const hrt_address		addr);
98
99/*! Read a 64-bit value from a device register or memory in the device
100
101 \param	addr[in]			Local address
102
103 \return device[addr]
104 */
105uint64_t ia_css_device_load_uint64(
106    const hrt_address		addr);
107
108/*! Write an 8-bit value to a device register or memory in the device
109
110 \param	addr[in]			Local address
111 \param	data[in]			value
112
113 \return none, device[addr] = value
114 */
115void ia_css_device_store_uint8(
116    const hrt_address		addr,
117    const uint8_t			data);
118
119/*! Write a 16-bit value to a device register or memory in the device
120
121 \param	addr[in]			Local address
122 \param	data[in]			value
123
124 \return none, device[addr] = value
125 */
126void ia_css_device_store_uint16(
127    const hrt_address		addr,
128    const uint16_t			data);
129
130/*! Write a 32-bit value to a device register or memory in the device
131
132 \param	addr[in]			Local address
133 \param	data[in]			value
134
135 \return none, device[addr] = value
136 */
137void ia_css_device_store_uint32(
138    const hrt_address		addr,
139    const uint32_t			data);
140
141/*! Write a 64-bit value to a device register or memory in the device
142
143 \param	addr[in]			Local address
144 \param	data[in]			value
145
146 \return none, device[addr] = value
147 */
148void ia_css_device_store_uint64(
149    const hrt_address		addr,
150    const uint64_t			data);
151
152/*! Read an array of bytes from device registers or memory in the device
153
154 \param	addr[in]			Local address
155 \param	data[out]			pointer to the destination array
156 \param	size[in]			number of bytes to read
157
158 \return none
159 */
160void ia_css_device_load(
161    const hrt_address		addr,
162    void					*data,
163    const size_t			size);
164
165/*! Write an array of bytes to device registers or memory in the device
166
167 \param	addr[in]			Local address
168 \param	data[in]			pointer to the source array
169 \param	size[in]			number of bytes to write
170
171 \return none
172 */
173void ia_css_device_store(
174    const hrt_address		addr,
175    const void				*data,
176    const size_t			size);
177
178#endif /* __DEVICE_ACCESS_H_INCLUDED__ */
179