1
/* Copyright 2013-2014 IBM Corp.
3
* Licensed under the Apache License, Version 2.0 (the "License");
4
* you may not use this file except in compliance with the License.
5
* You may obtain a copy of the License at
7
* http://www.apache.org/licenses/LICENSE-2.0
9
* Unless required by applicable law or agreed to in writing, software
10
* distributed under the License is distributed on an "AS IS" BASIS,
11
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
24
#include <processor.h>
25
#include <ccan/endian/endian.h>
30
* __in_beXX() / __out_beXX() : non-byteswap, no barrier
31
* in_beXX() / out_beXX() : non-byteswap, barrier
32
* in_leXX() / out_leXX() : byteswap, barrier
35
static inline uint8_t __in_8(const volatile uint8_t *addr)
38
asm volatile("lbzcix %0,0,%1" :
39
"=r"(val) : "r"(addr), "m"(*addr) : "memory");
43
static inline uint8_t in_8(const volatile uint8_t *addr)
49
static inline uint16_t __in_be16(const volatile uint16_t *addr)
52
asm volatile("lhzcix %0,0,%1" :
53
"=r"(val) : "r"(addr), "m"(*addr) : "memory");
57
static inline uint16_t in_be16(const volatile uint16_t *addr)
60
return __in_be16(addr);
63
static inline uint16_t in_le16(const volatile uint16_t *addr)
65
return bswap_16(in_be16(addr));
68
static inline uint32_t __in_be32(const volatile uint32_t *addr)
71
asm volatile("lwzcix %0,0,%1" :
72
"=r"(val) : "r"(addr), "m"(*addr) : "memory");
76
static inline uint32_t in_be32(const volatile uint32_t *addr)
79
return __in_be32(addr);
82
static inline uint32_t in_le32(const volatile uint32_t *addr)
84
return bswap_32(in_be32(addr));
87
static inline uint64_t __in_be64(const volatile uint64_t *addr)
90
asm volatile("ldcix %0,0,%1" :
91
"=r"(val) : "r"(addr), "m"(*addr) : "memory");
95
static inline uint64_t in_be64(const volatile uint64_t *addr)
98
return __in_be64(addr);
101
static inline uint64_t in_le64(const volatile uint64_t *addr)
103
return bswap_64(in_be64(addr));
106
static inline void __out_8(volatile uint8_t *addr, uint8_t val)
108
asm volatile("stbcix %0,0,%1"
109
: : "r"(val), "r"(addr), "m"(*addr) : "memory");
112
static inline void out_8(volatile uint8_t *addr, uint8_t val)
115
return __out_8(addr, val);
118
static inline void __out_be16(volatile uint16_t *addr, uint16_t val)
120
asm volatile("sthcix %0,0,%1"
121
: : "r"(val), "r"(addr), "m"(*addr) : "memory");
124
static inline void out_be16(volatile uint16_t *addr, uint16_t val)
127
return __out_be16(addr, val);
130
static inline void out_le16(volatile uint16_t *addr, uint16_t val)
132
out_be16(addr, bswap_16(val));
135
static inline void __out_be32(volatile uint32_t *addr, uint32_t val)
137
asm volatile("stwcix %0,0,%1"
138
: : "r"(val), "r"(addr), "m"(*addr) : "memory");
141
static inline void out_be32(volatile uint32_t *addr, uint32_t val)
144
return __out_be32(addr, val);
147
static inline void out_le32(volatile uint32_t *addr, uint32_t val)
149
out_be32(addr, bswap_32(val));
152
static inline void __out_be64(volatile uint64_t *addr, uint64_t val)
154
asm volatile("stdcix %0,0,%1"
155
: : "r"(val), "r"(addr), "m"(*addr) : "memory");
158
static inline void out_be64(volatile uint64_t *addr, uint64_t val)
161
return __out_be64(addr, val);
164
static inline void out_le64(volatile uint64_t *addr, uint64_t val)
166
out_be64(addr, bswap_64(val));
169
/* Assistant to macros used to access PCI config space */
171
#define out_le8 out_8
173
#endif /* __ASSEMBLY__ */