xref: /freebsd/sys/contrib/alpine-hal/al_hal_plat_services.h (revision d002f039aeb370370cd2cba63ad55cc4cf16c932)
1f4b37ed0SZbigniew Bodek /*-
2f4b37ed0SZbigniew Bodek *******************************************************************************
3f4b37ed0SZbigniew Bodek Copyright (C) 2015 Annapurna Labs Ltd.
4f4b37ed0SZbigniew Bodek 
5f4b37ed0SZbigniew Bodek This file may be licensed under the terms of the Annapurna Labs Commercial
6f4b37ed0SZbigniew Bodek License Agreement.
7f4b37ed0SZbigniew Bodek 
8f4b37ed0SZbigniew Bodek Alternatively, this file can be distributed under the terms of the GNU General
9f4b37ed0SZbigniew Bodek Public License V2 as published by the Free Software Foundation and can be
10f4b37ed0SZbigniew Bodek found at http://www.gnu.org/licenses/gpl-2.0.html
11f4b37ed0SZbigniew Bodek 
12f4b37ed0SZbigniew Bodek Alternatively, redistribution and use in source and binary forms, with or
13f4b37ed0SZbigniew Bodek without modification, are permitted provided that the following conditions are
14f4b37ed0SZbigniew Bodek met:
15f4b37ed0SZbigniew Bodek 
16f4b37ed0SZbigniew Bodek     *     Redistributions of source code must retain the above copyright notice,
17f4b37ed0SZbigniew Bodek this list of conditions and the following disclaimer.
18f4b37ed0SZbigniew Bodek 
19f4b37ed0SZbigniew Bodek     *     Redistributions in binary form must reproduce the above copyright
20f4b37ed0SZbigniew Bodek notice, this list of conditions and the following disclaimer in
21f4b37ed0SZbigniew Bodek the documentation and/or other materials provided with the
22f4b37ed0SZbigniew Bodek distribution.
23f4b37ed0SZbigniew Bodek 
24f4b37ed0SZbigniew Bodek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25f4b37ed0SZbigniew Bodek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26f4b37ed0SZbigniew Bodek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27f4b37ed0SZbigniew Bodek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
28f4b37ed0SZbigniew Bodek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29f4b37ed0SZbigniew Bodek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30f4b37ed0SZbigniew Bodek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31f4b37ed0SZbigniew Bodek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32f4b37ed0SZbigniew Bodek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33f4b37ed0SZbigniew Bodek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34f4b37ed0SZbigniew Bodek 
35f4b37ed0SZbigniew Bodek *******************************************************************************/
36f4b37ed0SZbigniew Bodek 
37f4b37ed0SZbigniew Bodek /**
38f4b37ed0SZbigniew Bodek  * @defgroup group_services Platform Services API
39f4b37ed0SZbigniew Bodek  *  @{
40f4b37ed0SZbigniew Bodek  * The Platform Services API provides miscellaneous system services to HAL
41f4b37ed0SZbigniew Bodek  * drivers, such as:
42f4b37ed0SZbigniew Bodek  * - Registers read/write
43f4b37ed0SZbigniew Bodek  * - Assertions
44f4b37ed0SZbigniew Bodek  * - Memory barriers
45f4b37ed0SZbigniew Bodek  * - Endianness conversions
46f4b37ed0SZbigniew Bodek  *
47f4b37ed0SZbigniew Bodek  * And more.
48f4b37ed0SZbigniew Bodek  * @file   plat_api/sample/al_hal_plat_services.h
49f4b37ed0SZbigniew Bodek  *
50f4b37ed0SZbigniew Bodek  * @brief  API for Platform services provided for to HAL drivers
51f4b37ed0SZbigniew Bodek  *
52f4b37ed0SZbigniew Bodek  *
53f4b37ed0SZbigniew Bodek  */
54f4b37ed0SZbigniew Bodek 
55f4b37ed0SZbigniew Bodek #ifndef __PLAT_SERVICES_H__
56f4b37ed0SZbigniew Bodek #define __PLAT_SERVICES_H__
57f4b37ed0SZbigniew Bodek 
58f4b37ed0SZbigniew Bodek #include <machine/atomic.h>
59f4b37ed0SZbigniew Bodek #include <sys/cdefs.h>
60f4b37ed0SZbigniew Bodek __FBSDID("$FreeBSD$");
61f4b37ed0SZbigniew Bodek 
62f4b37ed0SZbigniew Bodek #include <sys/param.h>
63f4b37ed0SZbigniew Bodek #include <sys/systm.h>
64f4b37ed0SZbigniew Bodek #include <sys/kernel.h>
65f4b37ed0SZbigniew Bodek #include <sys/endian.h>
66f4b37ed0SZbigniew Bodek #include <sys/errno.h>
67f4b37ed0SZbigniew Bodek #include <sys/lock.h>
68f4b37ed0SZbigniew Bodek #include <sys/mutex.h>
69*3fc36ee0SWojciech Macek #include <machine/bus.h>
70f4b37ed0SZbigniew Bodek 
71f4b37ed0SZbigniew Bodek /* Prototypes for all the bus_space structure functions */
72*3fc36ee0SWojciech Macek uint8_t	generic_bs_r_1(bus_space_tag_t t, bus_space_handle_t bsh,
73*3fc36ee0SWojciech Macek     bus_size_t offset);
74*3fc36ee0SWojciech Macek 
75*3fc36ee0SWojciech Macek uint16_t generic_bs_r_2(bus_space_tag_t t, bus_space_handle_t bsh,
76*3fc36ee0SWojciech Macek     bus_size_t offset);
77*3fc36ee0SWojciech Macek 
78*3fc36ee0SWojciech Macek uint32_t generic_bs_r_4(bus_space_tag_t t, bus_space_handle_t bsh,
79*3fc36ee0SWojciech Macek     bus_size_t offset);
80*3fc36ee0SWojciech Macek 
81*3fc36ee0SWojciech Macek void generic_bs_w_1(bus_space_tag_t t, bus_space_handle_t bsh,
82*3fc36ee0SWojciech Macek     bus_size_t offset, uint8_t value);
83*3fc36ee0SWojciech Macek 
84*3fc36ee0SWojciech Macek void generic_bs_w_2(bus_space_tag_t t, bus_space_handle_t bsh,
85*3fc36ee0SWojciech Macek     bus_size_t offset, uint16_t value);
86*3fc36ee0SWojciech Macek 
87*3fc36ee0SWojciech Macek void generic_bs_w_4(bus_space_tag_t t, bus_space_handle_t bsh,
88*3fc36ee0SWojciech Macek     bus_size_t offset, uint32_t value);
89*3fc36ee0SWojciech Macek 
90*3fc36ee0SWojciech Macek void generic_bs_w_8(bus_space_tag_t t, bus_space_handle_t bsh,
91*3fc36ee0SWojciech Macek     bus_size_t offset, uint64_t value);
92f4b37ed0SZbigniew Bodek 
93f4b37ed0SZbigniew Bodek #define __UNUSED __attribute__((unused))
94f4b37ed0SZbigniew Bodek 
95f4b37ed0SZbigniew Bodek /* *INDENT-OFF* */
96f4b37ed0SZbigniew Bodek #ifdef __cplusplus
97f4b37ed0SZbigniew Bodek extern "C" {
98f4b37ed0SZbigniew Bodek #endif
99f4b37ed0SZbigniew Bodek /* *INDENT-ON* */
100f4b37ed0SZbigniew Bodek 
101*3fc36ee0SWojciech Macek /**
102*3fc36ee0SWojciech Macek   * Make sure data will be visible by other masters (other CPUS and DMA).
103*3fc36ee0SWojciech Macek   * usually this is achieved by the ARM DMB instruction.
104*3fc36ee0SWojciech Macek   */
105*3fc36ee0SWojciech Macek static void al_data_memory_barrier(void);
106*3fc36ee0SWojciech Macek static void al_smp_data_memory_barrier(void);
107*3fc36ee0SWojciech Macek 
108*3fc36ee0SWojciech Macek /**
109*3fc36ee0SWojciech Macek   * Make sure data will be visible by DMA masters, no restriction for other cpus
110*3fc36ee0SWojciech Macek   */
111*3fc36ee0SWojciech Macek static inline void
al_data_memory_barrier(void)112*3fc36ee0SWojciech Macek al_data_memory_barrier(void)
113*3fc36ee0SWojciech Macek {
114*3fc36ee0SWojciech Macek #ifndef __aarch64__
115*3fc36ee0SWojciech Macek 	dsb();
116*3fc36ee0SWojciech Macek #else
117*3fc36ee0SWojciech Macek 	dsb(sy);
118*3fc36ee0SWojciech Macek #endif
119*3fc36ee0SWojciech Macek }
120*3fc36ee0SWojciech Macek 
121*3fc36ee0SWojciech Macek /**
122*3fc36ee0SWojciech Macek   * Make sure data will be visible in order by other cpus masters.
123*3fc36ee0SWojciech Macek   */
124*3fc36ee0SWojciech Macek static inline void
al_smp_data_memory_barrier(void)125*3fc36ee0SWojciech Macek al_smp_data_memory_barrier(void)
126*3fc36ee0SWojciech Macek {
127*3fc36ee0SWojciech Macek #ifndef __aarch64__
128*3fc36ee0SWojciech Macek 	dmb();
129*3fc36ee0SWojciech Macek #else
130*3fc36ee0SWojciech Macek 	dmb(ish);
131*3fc36ee0SWojciech Macek #endif
132*3fc36ee0SWojciech Macek }
133*3fc36ee0SWojciech Macek 
134*3fc36ee0SWojciech Macek /**
135*3fc36ee0SWojciech Macek   * Make sure write data will be visible in order by other cpus masters.
136*3fc36ee0SWojciech Macek   */
137*3fc36ee0SWojciech Macek static inline void
al_local_data_memory_barrier(void)138*3fc36ee0SWojciech Macek al_local_data_memory_barrier(void)
139*3fc36ee0SWojciech Macek {
140*3fc36ee0SWojciech Macek #ifndef __aarch64__
141*3fc36ee0SWojciech Macek 	dsb();
142*3fc36ee0SWojciech Macek #else
143*3fc36ee0SWojciech Macek 	dsb(sy);
144*3fc36ee0SWojciech Macek #endif
145*3fc36ee0SWojciech Macek }
146*3fc36ee0SWojciech Macek 
147f4b37ed0SZbigniew Bodek /*
148f4b37ed0SZbigniew Bodek  * WMA: This is a hack which allows not modifying the __iomem accessing HAL code.
149f4b37ed0SZbigniew Bodek  * On ARMv7, bus_handle holds the information about VA of accessed memory. It
150f4b37ed0SZbigniew Bodek  * is possible to use direct load/store instruction instead of bus_dma machinery.
151f4b37ed0SZbigniew Bodek  * WARNING: This is not guaranteed to stay that way forever, nor that
152f4b37ed0SZbigniew Bodek  * on other architectures these variables behave similarly. Keep that
153f4b37ed0SZbigniew Bodek  * in mind during porting to other systems.
154f4b37ed0SZbigniew Bodek  */
155f4b37ed0SZbigniew Bodek /**
156f4b37ed0SZbigniew Bodek  * Read MMIO 8 bits register
157f4b37ed0SZbigniew Bodek  * @param  offset	register offset
158f4b37ed0SZbigniew Bodek  *
159f4b37ed0SZbigniew Bodek  * @return register value
160f4b37ed0SZbigniew Bodek  */
161f4b37ed0SZbigniew Bodek static uint8_t al_reg_read8(uint8_t * offset);
162f4b37ed0SZbigniew Bodek 
163f4b37ed0SZbigniew Bodek /**
164f4b37ed0SZbigniew Bodek  * Read MMIO 16 bits register
165f4b37ed0SZbigniew Bodek  * @param  offset	register offset
166f4b37ed0SZbigniew Bodek  *
167f4b37ed0SZbigniew Bodek  * @return register value
168f4b37ed0SZbigniew Bodek  */
169f4b37ed0SZbigniew Bodek static uint16_t al_reg_read16(uint16_t * offset);
170f4b37ed0SZbigniew Bodek 
171f4b37ed0SZbigniew Bodek /**
172f4b37ed0SZbigniew Bodek  * Read MMIO 32 bits register
173f4b37ed0SZbigniew Bodek  * @param  offset	register offset
174f4b37ed0SZbigniew Bodek  *
175f4b37ed0SZbigniew Bodek  * @return register value
176f4b37ed0SZbigniew Bodek  */
177f4b37ed0SZbigniew Bodek static uint32_t al_reg_read32(uint32_t * offset);
178f4b37ed0SZbigniew Bodek 
179f4b37ed0SZbigniew Bodek /**
180f4b37ed0SZbigniew Bodek  * Read MMIO 64 bits register
181f4b37ed0SZbigniew Bodek  * @param  offset	register offset
182f4b37ed0SZbigniew Bodek  *
183f4b37ed0SZbigniew Bodek  * @return register value
184f4b37ed0SZbigniew Bodek  */
185f4b37ed0SZbigniew Bodek uint64_t al_reg_read64(uint64_t * offset);
186f4b37ed0SZbigniew Bodek 
187f4b37ed0SZbigniew Bodek /**
188f4b37ed0SZbigniew Bodek  * Relaxed read MMIO 32 bits register
189f4b37ed0SZbigniew Bodek  *
190f4b37ed0SZbigniew Bodek  * Relaxed register read/write functions don't involve cpu instructions that
191f4b37ed0SZbigniew Bodek  * force syncronization, nor ordering between the register access and memory
192f4b37ed0SZbigniew Bodek  * data access.
193f4b37ed0SZbigniew Bodek  * These instructions are used in performance critical code to avoid the
194f4b37ed0SZbigniew Bodek  * overhead of the synchronization instructions.
195f4b37ed0SZbigniew Bodek  *
196f4b37ed0SZbigniew Bodek  * @param  offset	register offset
197f4b37ed0SZbigniew Bodek  *
198f4b37ed0SZbigniew Bodek  * @return register value
199f4b37ed0SZbigniew Bodek  */
200f4b37ed0SZbigniew Bodek #define al_bus_dma_to_va(bus_tag, bus_handle)	((void*)bus_handle)
201f4b37ed0SZbigniew Bodek 
202f4b37ed0SZbigniew Bodek /**
203f4b37ed0SZbigniew Bodek  * Relaxed read MMIO 32 bits register
204f4b37ed0SZbigniew Bodek  *
205f4b37ed0SZbigniew Bodek  * Relaxed register read/write functions don't involve cpu instructions that
206f4b37ed0SZbigniew Bodek  * force syncronization, nor ordering between the register access and memory
207f4b37ed0SZbigniew Bodek  * data access.
208f4b37ed0SZbigniew Bodek  * These instructions are used in performance critical code to avoid the
209f4b37ed0SZbigniew Bodek  * overhead of the synchronization instructions.
210f4b37ed0SZbigniew Bodek  *
211f4b37ed0SZbigniew Bodek  * @param  offset	register offset
212f4b37ed0SZbigniew Bodek  *
213f4b37ed0SZbigniew Bodek  * @return register value
214f4b37ed0SZbigniew Bodek  */
215f4b37ed0SZbigniew Bodek #define al_reg_read32_relaxed(l)	generic_bs_r_4(NULL, (bus_space_handle_t)l, 0)
216f4b37ed0SZbigniew Bodek 
217f4b37ed0SZbigniew Bodek /**
218f4b37ed0SZbigniew Bodek  * Relaxed write to MMIO 32 bits register
219f4b37ed0SZbigniew Bodek  *
220f4b37ed0SZbigniew Bodek  * Relaxed register read/write functions don't involve cpu instructions that
221f4b37ed0SZbigniew Bodek  * force syncronization, nor ordering between the register access and memory
222f4b37ed0SZbigniew Bodek  * data access.
223f4b37ed0SZbigniew Bodek  * These instructions are used in performance critical code to avoid the
224f4b37ed0SZbigniew Bodek  * overhead of the synchronization instructions.
225f4b37ed0SZbigniew Bodek  *
226f4b37ed0SZbigniew Bodek  * @param  offset	register offset
227f4b37ed0SZbigniew Bodek  * @param  val		value to write to the register
228f4b37ed0SZbigniew Bodek  */
229f4b37ed0SZbigniew Bodek #define al_reg_write32_relaxed(l,v)	generic_bs_w_4(NULL, (bus_space_handle_t)l, 0, v)
230f4b37ed0SZbigniew Bodek 
231f4b37ed0SZbigniew Bodek /**
232f4b37ed0SZbigniew Bodek  * Write to MMIO 8 bits register
233f4b37ed0SZbigniew Bodek  * @param  offset	register offset
234f4b37ed0SZbigniew Bodek  * @param  val		value to write to the register
235f4b37ed0SZbigniew Bodek  */
236*3fc36ee0SWojciech Macek #define al_reg_write8(l, v) do {				\
237*3fc36ee0SWojciech Macek 	al_data_memory_barrier();				\
238*3fc36ee0SWojciech Macek 	generic_bs_w_1(NULL, (bus_space_handle_t)l, 0, v);	\
239*3fc36ee0SWojciech Macek 	al_smp_data_memory_barrier();				\
240*3fc36ee0SWojciech Macek } while (0)
241f4b37ed0SZbigniew Bodek 
242f4b37ed0SZbigniew Bodek /**
243f4b37ed0SZbigniew Bodek  * Write to MMIO 16 bits register
244f4b37ed0SZbigniew Bodek  * @param  offset	register offset
245f4b37ed0SZbigniew Bodek  * @param  val		value to write to the register
246f4b37ed0SZbigniew Bodek  */
247*3fc36ee0SWojciech Macek #define al_reg_write16(l, v) do {				\
248*3fc36ee0SWojciech Macek 	al_data_memory_barrier();				\
249*3fc36ee0SWojciech Macek 	generic_bs_w_2(NULL, (bus_space_handle_t)l, 0, v);	\
250*3fc36ee0SWojciech Macek 	al_smp_data_memory_barrier();				\
251*3fc36ee0SWojciech Macek } while (0)
252f4b37ed0SZbigniew Bodek 
253f4b37ed0SZbigniew Bodek /**
254f4b37ed0SZbigniew Bodek  * Write to MMIO 32 bits register
255f4b37ed0SZbigniew Bodek  * @param  offset	register offset
256f4b37ed0SZbigniew Bodek  * @param  val		value to write to the register
257f4b37ed0SZbigniew Bodek  */
258*3fc36ee0SWojciech Macek #define al_reg_write32(l, v) do {				\
259*3fc36ee0SWojciech Macek 	al_data_memory_barrier();				\
260*3fc36ee0SWojciech Macek 	generic_bs_w_4(NULL, (bus_space_handle_t)l, 0, v);	\
261*3fc36ee0SWojciech Macek 	al_smp_data_memory_barrier();				\
262*3fc36ee0SWojciech Macek } while (0)
263f4b37ed0SZbigniew Bodek 
264f4b37ed0SZbigniew Bodek /**
265f4b37ed0SZbigniew Bodek  * Write to MMIO 64 bits register
266f4b37ed0SZbigniew Bodek  * @param  offset	register offset
267f4b37ed0SZbigniew Bodek  * @param  val		value to write to the register
268f4b37ed0SZbigniew Bodek  */
269*3fc36ee0SWojciech Macek #define al_reg_write64(l, v) do {				\
270*3fc36ee0SWojciech Macek 	al_data_memory_barrier();				\
271*3fc36ee0SWojciech Macek 	generic_bs_w_8(NULL, (bus_space_handle_t)l, 0, v);	\
272*3fc36ee0SWojciech Macek 	al_smp_data_memory_barrier();				\
273*3fc36ee0SWojciech Macek } while (0)
274f4b37ed0SZbigniew Bodek 
275f4b37ed0SZbigniew Bodek static inline uint8_t
al_reg_read8(uint8_t * l)276f4b37ed0SZbigniew Bodek al_reg_read8(uint8_t *l)
277f4b37ed0SZbigniew Bodek {
278f4b37ed0SZbigniew Bodek 
279*3fc36ee0SWojciech Macek 	al_data_memory_barrier();
280f4b37ed0SZbigniew Bodek 	return (generic_bs_r_1(NULL, (bus_space_handle_t)l, 0));
281f4b37ed0SZbigniew Bodek }
282f4b37ed0SZbigniew Bodek 
283f4b37ed0SZbigniew Bodek static inline uint16_t
al_reg_read16(uint16_t * l)284f4b37ed0SZbigniew Bodek al_reg_read16(uint16_t *l)
285f4b37ed0SZbigniew Bodek {
286f4b37ed0SZbigniew Bodek 
287*3fc36ee0SWojciech Macek 	al_data_memory_barrier();
288f4b37ed0SZbigniew Bodek 	return (generic_bs_r_2(NULL, (bus_space_handle_t)l, 0));
289f4b37ed0SZbigniew Bodek }
290f4b37ed0SZbigniew Bodek 
291f4b37ed0SZbigniew Bodek static inline uint32_t
al_reg_read32(uint32_t * l)292f4b37ed0SZbigniew Bodek al_reg_read32(uint32_t *l)
293f4b37ed0SZbigniew Bodek {
294f4b37ed0SZbigniew Bodek 
295*3fc36ee0SWojciech Macek 	al_data_memory_barrier();
296f4b37ed0SZbigniew Bodek 	return (generic_bs_r_4(NULL, (bus_space_handle_t)l, 0));
297f4b37ed0SZbigniew Bodek }
298f4b37ed0SZbigniew Bodek 
299f4b37ed0SZbigniew Bodek #define AL_DBG_LEVEL_NONE 0
300f4b37ed0SZbigniew Bodek #define AL_DBG_LEVEL_ERR 1
301f4b37ed0SZbigniew Bodek #define AL_DBG_LEVEL_WARN 2
302f4b37ed0SZbigniew Bodek #define AL_DBG_LEVEL_INFO 3
303f4b37ed0SZbigniew Bodek #define AL_DBG_LEVEL_DBG 4
304f4b37ed0SZbigniew Bodek 
305f4b37ed0SZbigniew Bodek #define AL_DBG_LEVEL AL_DBG_LEVEL_ERR
306f4b37ed0SZbigniew Bodek 
307*3fc36ee0SWojciech Macek #define AL_DBG_LOCK()
308*3fc36ee0SWojciech Macek #define AL_DBG_UNLOCK()
309f4b37ed0SZbigniew Bodek 
310f4b37ed0SZbigniew Bodek /**
311f4b37ed0SZbigniew Bodek  * print message
312f4b37ed0SZbigniew Bodek  *
313f4b37ed0SZbigniew Bodek  * @param format The format string
314f4b37ed0SZbigniew Bodek  * @param ... Additional arguments
315f4b37ed0SZbigniew Bodek  */
316f4b37ed0SZbigniew Bodek #define al_print(type, fmt, ...) 		do { if (AL_DBG_LEVEL >= AL_DBG_LEVEL_NONE) { AL_DBG_LOCK(); printf(fmt, ##__VA_ARGS__); AL_DBG_UNLOCK(); } } while(0)
317f4b37ed0SZbigniew Bodek 
318f4b37ed0SZbigniew Bodek /**
319f4b37ed0SZbigniew Bodek  * print error message
320f4b37ed0SZbigniew Bodek  *
321f4b37ed0SZbigniew Bodek  * @param format
322f4b37ed0SZbigniew Bodek  */
323f4b37ed0SZbigniew Bodek #define al_err(...)			do { if (AL_DBG_LEVEL >= AL_DBG_LEVEL_ERR) { AL_DBG_LOCK(); printf(__VA_ARGS__); AL_DBG_UNLOCK(); } } while(0)
324f4b37ed0SZbigniew Bodek 
325f4b37ed0SZbigniew Bodek /**
326f4b37ed0SZbigniew Bodek  * print warning message
327f4b37ed0SZbigniew Bodek  *
328f4b37ed0SZbigniew Bodek  * @param format
329f4b37ed0SZbigniew Bodek  */
330f4b37ed0SZbigniew Bodek #define al_warn(...)			do { if (AL_DBG_LEVEL >= AL_DBG_LEVEL_WARN) { AL_DBG_LOCK(); printf(__VA_ARGS__); AL_DBG_UNLOCK(); } } while(0)
331f4b37ed0SZbigniew Bodek 
332f4b37ed0SZbigniew Bodek /**
333f4b37ed0SZbigniew Bodek  * print info message
334f4b37ed0SZbigniew Bodek  *
335f4b37ed0SZbigniew Bodek  * @param format
336f4b37ed0SZbigniew Bodek  */
337f4b37ed0SZbigniew Bodek #define al_info(...)			do { if (AL_DBG_LEVEL >= AL_DBG_LEVEL_INFO) { AL_DBG_LOCK(); printf(__VA_ARGS__); AL_DBG_UNLOCK(); } } while(0)
338f4b37ed0SZbigniew Bodek 
339f4b37ed0SZbigniew Bodek /**
340f4b37ed0SZbigniew Bodek  * print debug message
341f4b37ed0SZbigniew Bodek  *
342f4b37ed0SZbigniew Bodek  * @param format
343f4b37ed0SZbigniew Bodek  */
344f4b37ed0SZbigniew Bodek #define al_dbg(...)			do { if (AL_DBG_LEVEL >= AL_DBG_LEVEL_DBG) { AL_DBG_LOCK(); printf(__VA_ARGS__); AL_DBG_UNLOCK(); } } while(0)
345f4b37ed0SZbigniew Bodek 
346f4b37ed0SZbigniew Bodek /**
347f4b37ed0SZbigniew Bodek  * Assertion
348f4b37ed0SZbigniew Bodek  *
349f4b37ed0SZbigniew Bodek  * @param condition
350f4b37ed0SZbigniew Bodek  */
351f4b37ed0SZbigniew Bodek #define al_assert(COND)		\
352f4b37ed0SZbigniew Bodek 	do {			\
353f4b37ed0SZbigniew Bodek 		if (!(COND))	\
354f4b37ed0SZbigniew Bodek 			al_err(	\
355f4b37ed0SZbigniew Bodek 			"%s:%d:%s: Assertion failed! (%s)\n",	\
356f4b37ed0SZbigniew Bodek 			__FILE__, __LINE__, __func__, #COND);	\
357f4b37ed0SZbigniew Bodek 	} while(AL_FALSE)
358f4b37ed0SZbigniew Bodek 
359f4b37ed0SZbigniew Bodek /**
360f4b37ed0SZbigniew Bodek  * al_udelay - micro sec delay
361f4b37ed0SZbigniew Bodek  */
362f4b37ed0SZbigniew Bodek #define al_udelay(u)		DELAY(u)
363f4b37ed0SZbigniew Bodek 
364f4b37ed0SZbigniew Bodek /**
365f4b37ed0SZbigniew Bodek  * al_msleep - mili sec delay
366f4b37ed0SZbigniew Bodek  */
367f4b37ed0SZbigniew Bodek #define al_msleep(m)		DELAY((m) * 1000)
368f4b37ed0SZbigniew Bodek 
369f4b37ed0SZbigniew Bodek /**
370f4b37ed0SZbigniew Bodek  * swap half word to little endian
371f4b37ed0SZbigniew Bodek  *
372f4b37ed0SZbigniew Bodek  * @param x 16 bit value
373f4b37ed0SZbigniew Bodek  *
374f4b37ed0SZbigniew Bodek  * @return the value in little endian
375f4b37ed0SZbigniew Bodek  */
376f4b37ed0SZbigniew Bodek #define swap16_to_le(x)		htole16(x)
377f4b37ed0SZbigniew Bodek /**
378f4b37ed0SZbigniew Bodek  * swap word to little endian
379f4b37ed0SZbigniew Bodek  *
380f4b37ed0SZbigniew Bodek  * @param x 32 bit value
381f4b37ed0SZbigniew Bodek  *
382f4b37ed0SZbigniew Bodek  * @return the value in little endian
383f4b37ed0SZbigniew Bodek  */
384f4b37ed0SZbigniew Bodek #define swap32_to_le(x)		htole32(x)
385f4b37ed0SZbigniew Bodek 
386f4b37ed0SZbigniew Bodek /**
387f4b37ed0SZbigniew Bodek  * swap 8 bytes to little endian
388f4b37ed0SZbigniew Bodek  *
389f4b37ed0SZbigniew Bodek  * @param x 64 bit value
390f4b37ed0SZbigniew Bodek  *
391f4b37ed0SZbigniew Bodek  * @return the value in little endian
392f4b37ed0SZbigniew Bodek  */
393f4b37ed0SZbigniew Bodek #define swap64_to_le(x)		htole64(x)
394f4b37ed0SZbigniew Bodek 
395f4b37ed0SZbigniew Bodek /**
396f4b37ed0SZbigniew Bodek  * swap half word from little endian
397f4b37ed0SZbigniew Bodek  *
398f4b37ed0SZbigniew Bodek  * @param x 16 bit value
399f4b37ed0SZbigniew Bodek  *
400f4b37ed0SZbigniew Bodek  * @return the value in the cpu endianess
401f4b37ed0SZbigniew Bodek  */
402f4b37ed0SZbigniew Bodek #define swap16_from_le(x)	le16toh(x)
403f4b37ed0SZbigniew Bodek 
404f4b37ed0SZbigniew Bodek /**
405f4b37ed0SZbigniew Bodek  * swap word from little endian
406f4b37ed0SZbigniew Bodek  *
407f4b37ed0SZbigniew Bodek  * @param x 32 bit value
408f4b37ed0SZbigniew Bodek  *
409f4b37ed0SZbigniew Bodek  * @return the value in the cpu endianess
410f4b37ed0SZbigniew Bodek  */
411f4b37ed0SZbigniew Bodek #define swap32_from_le(x)	le32toh(x)
412f4b37ed0SZbigniew Bodek 
413f4b37ed0SZbigniew Bodek /**
414f4b37ed0SZbigniew Bodek  * swap 8 bytes from little endian
415f4b37ed0SZbigniew Bodek  *
416f4b37ed0SZbigniew Bodek  * @param x 64 bit value
417f4b37ed0SZbigniew Bodek  *
418f4b37ed0SZbigniew Bodek  * @return the value in the cpu endianess
419f4b37ed0SZbigniew Bodek  */
420f4b37ed0SZbigniew Bodek #define swap64_from_le(x)	le64toh(x)
421f4b37ed0SZbigniew Bodek 
422f4b37ed0SZbigniew Bodek /**
423f4b37ed0SZbigniew Bodek  * Memory set
424f4b37ed0SZbigniew Bodek  *
425f4b37ed0SZbigniew Bodek  * @param p memory pointer
426f4b37ed0SZbigniew Bodek  * @param val value for setting
427f4b37ed0SZbigniew Bodek  * @param cnt number of bytes to set
428f4b37ed0SZbigniew Bodek  */
429f4b37ed0SZbigniew Bodek #define al_memset(p, val, cnt)	memset(p, val, cnt)
430f4b37ed0SZbigniew Bodek 
431f4b37ed0SZbigniew Bodek /**
432f4b37ed0SZbigniew Bodek  * Memory copy
433f4b37ed0SZbigniew Bodek  *
434f4b37ed0SZbigniew Bodek  * @param p1 memory pointer
435f4b37ed0SZbigniew Bodek  * @param p2 memory pointer
436f4b37ed0SZbigniew Bodek  * @param cnt number of bytes to copy
437f4b37ed0SZbigniew Bodek  */
438f4b37ed0SZbigniew Bodek #define al_memcpy(p1, p2, cnt)	memcpy(p1, p2, cnt)
439f4b37ed0SZbigniew Bodek 
440f4b37ed0SZbigniew Bodek /**
441f4b37ed0SZbigniew Bodek  * Memory compare
442f4b37ed0SZbigniew Bodek  *
443f4b37ed0SZbigniew Bodek  * @param p1 memory pointer
444f4b37ed0SZbigniew Bodek  * @param p2 memory pointer
445f4b37ed0SZbigniew Bodek  * @param cnt number of bytes to compare
446f4b37ed0SZbigniew Bodek  */
447f4b37ed0SZbigniew Bodek #define al_memcmp(p1, p2, cnt)	memcmp(p1, p2, cnt)
448f4b37ed0SZbigniew Bodek 
449f4b37ed0SZbigniew Bodek /**
450f4b37ed0SZbigniew Bodek  * String compare
451f4b37ed0SZbigniew Bodek  *
452f4b37ed0SZbigniew Bodek  * @param s1 string pointer
453f4b37ed0SZbigniew Bodek  * @param s2 string pointer
454f4b37ed0SZbigniew Bodek  */
455f4b37ed0SZbigniew Bodek #define al_strcmp(s1, s2)	strcmp(s1, s2)
456f4b37ed0SZbigniew Bodek 
457f4b37ed0SZbigniew Bodek #define al_get_cpu_id()		0
458f4b37ed0SZbigniew Bodek 
459f4b37ed0SZbigniew Bodek /* *INDENT-OFF* */
460f4b37ed0SZbigniew Bodek #ifdef __cplusplus
461f4b37ed0SZbigniew Bodek }
462f4b37ed0SZbigniew Bodek #endif
463f4b37ed0SZbigniew Bodek /* *INDENT-ON* */
464f4b37ed0SZbigniew Bodek /** @} end of Platform Services API group */
465f4b37ed0SZbigniew Bodek #endif				/* __PLAT_SERVICES_H__ */
466