blob: 2743852299cb4863fe8e2cbbc6cd0f56e8dd7ee2 [file] [log] [blame]
Stefan Reinauer8af0d032012-12-14 13:05:21 -08001/*
2 * This file is part of the libpayload project.
3 *
4 * Copyright (C) 2008 Advanced Micro Devices, Inc.
5 * Copyright (C) 2008 coresystems GmbH
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 */
30
31#ifndef _ARCH_IO_H
32#define _ARCH_IO_H
33
Stefan Reinauer6a7dd082013-06-19 12:39:52 -070034#include <stdint.h>
35#include <arch/cache.h>
Stefan Reinauer8af0d032012-12-14 13:05:21 -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)
Stefan Reinauer6a7dd082013-06-19 12:39:52 -070046{
47 dmb();
Julius Werner8a1d11f2014-07-17 10:43:15 -070048 return *(volatile const uint8_t *)_a;
Stefan Reinauer6a7dd082013-06-19 12:39:52 -070049}
50
Julius Werner8a1d11f2014-07-17 10:43:15 -070051static inline uint16_t readw(volatile const void *_a)
Stefan Reinauer6a7dd082013-06-19 12:39:52 -070052{
53 dmb();
Julius Werner8a1d11f2014-07-17 10:43:15 -070054 return *(volatile const uint16_t *)_a;
Stefan Reinauer6a7dd082013-06-19 12:39:52 -070055}
56
Julius Werner8a1d11f2014-07-17 10:43:15 -070057static inline uint32_t readl(volatile const void *_a)
Stefan Reinauer6a7dd082013-06-19 12:39:52 -070058{
59 dmb();
Julius Werner8a1d11f2014-07-17 10:43:15 -070060 return *(volatile const uint32_t *)_a;
Stefan Reinauer6a7dd082013-06-19 12:39:52 -070061}
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}
Stefan Reinauer8af0d032012-12-14 13:05:21 -080083
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
102static inline void write8(void *addr, uint8_t val)
103{
104 dmb();
105 *(volatile uint8_t *)addr = val;
106 dmb();
107}
108
109static inline void write16(void *addr, uint16_t val)
110{
111 dmb();
112 *(volatile uint16_t *)addr = val;
113 dmb();
114}
115
116static inline void write32(void *addr, uint32_t val)
117{
118 dmb();
119 *(volatile uint32_t *)addr = val;
120 dmb();
121}
122
Vadim Bendeburybc8b4fa2014-06-04 10:43:37 -0700123#endif