blob: 092198842fa9cfe46498c1fbb57c5ac3168cc898 [file] [log] [blame]
Furquan Shaikh8c8c3772014-02-19 11:35:30 -08001/*
Furquan Shaikh8c8c3772014-02-19 11:35:30 -08002 *
3 * Copyright (C) 2008 Advanced Micro Devices, Inc.
4 * Copyright (C) 2008 coresystems GmbH
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef _ARCH_IO_H
31#define _ARCH_IO_H
32
33#include <stdint.h>
34#include <arch/cache.h>
Furquan Shaikh635b45d2014-08-27 12:16:16 -070035#include <arch/lib_helpers.h>
Furquan Shaikh8c8c3772014-02-19 11:35:30 -080036
Daisuke Nojiri39493362015-06-25 16:19:49 -070037/*
38 * readb/w/l writeb/w/l are deprecated. use read8/16/32 and write8/16/32
39 * instead for future development.
40 *
41 * TODO: make the existing code use read8/16/32 and write8/16/32 then remove
42 * readb/w/l and writeb/w/l.
43 */
44
Julius Werner8a1d11f2014-07-17 10:43:15 -070045static inline uint8_t readb(volatile const void *_a)
Furquan Shaikh8c8c3772014-02-19 11:35:30 -080046{
47 dmb();
Julius Werner8a1d11f2014-07-17 10:43:15 -070048 return *(volatile const uint8_t *)_a;
Furquan Shaikh8c8c3772014-02-19 11:35:30 -080049}
50
Julius Werner8a1d11f2014-07-17 10:43:15 -070051static inline uint16_t readw(volatile const void *_a)
Furquan Shaikh8c8c3772014-02-19 11:35:30 -080052{
53 dmb();
Julius Werner8a1d11f2014-07-17 10:43:15 -070054 return *(volatile const uint16_t *)_a;
Furquan Shaikh8c8c3772014-02-19 11:35:30 -080055}
56
Julius Werner8a1d11f2014-07-17 10:43:15 -070057static inline uint32_t readl(volatile const void *_a)
Furquan Shaikh8c8c3772014-02-19 11:35:30 -080058{
59 dmb();
Julius Werner8a1d11f2014-07-17 10:43:15 -070060 return *(volatile const uint32_t *)_a;
Furquan Shaikh8c8c3772014-02-19 11:35:30 -080061}
62
63static inline void writeb(uint8_t _v, volatile void *_a)
64{
65 dmb();
66 *(volatile uint8_t *)_a = _v;
67 dmb();
68}
69
70static inline void writew(uint16_t _v, volatile void *_a)
71{
72 dmb();
73 *(volatile uint16_t *)_a = _v;
74 dmb();
75}
76
77static inline void writel(uint32_t _v, volatile void *_a)
78{
79 dmb();
80 *(volatile uint32_t *)_a = _v;
81 dmb();
82}
83
Daisuke Nojiri39493362015-06-25 16:19:49 -070084static inline uint8_t read8(const void *addr)
85{
86 dmb();
87 return *(volatile uint8_t *)addr;
88}
89
90static inline uint16_t read16(const void *addr)
91{
92 dmb();
93 return *(volatile uint16_t *)addr;
94}
95
96static inline uint32_t read32(const void *addr)
97{
98 dmb();
99 return *(volatile uint32_t *)addr;
100}
101
Patrick Georgi60f53282021-01-29 14:08:48 +0100102static inline uint64_t read64(const void *addr)
103{
104 dmb();
105 return *(volatile uint64_t *)addr;
106}
107
Daisuke Nojiri39493362015-06-25 16:19:49 -0700108static inline void write8(void *addr, uint8_t val)
109{
110 dmb();
111 *(volatile uint8_t *)addr = val;
112 dmb();
113}
114
115static inline void write16(void *addr, uint16_t val)
116{
117 dmb();
118 *(volatile uint16_t *)addr = val;
119 dmb();
120}
121
122static inline void write32(void *addr, uint32_t val)
123{
124 dmb();
125 *(volatile uint32_t *)addr = val;
126 dmb();
127}
128
Patrick Georgi60f53282021-01-29 14:08:48 +0100129static inline void write64(void *addr, uint64_t val)
130{
131 dmb();
132 *(volatile uint64_t *)addr = val;
133 dmb();
134}
135
Furquan Shaikh8c8c3772014-02-19 11:35:30 -0800136#endif