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 #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;*/ 54 typedef 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 */ 63 void device_set_base_address( 64 const sys_address base_addr); 65 66 /*! Get the (sub)system base address 67 68 \return base_address, 69 */ 70 sys_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 */ 78 uint8_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 */ 87 uint16_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 */ 96 uint32_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 */ 105 uint64_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 */ 115 void 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 */ 126 void 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 */ 137 void 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 */ 148 void 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 */ 160 void 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 */ 173 void 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