coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mmio.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef __ARCH_MMIO_H__
4 #define __ARCH_MMIO_H__
5 
6 #include <stdint.h>
7 
8 /* NOTE: In some cases accesses to MMIO must be separated by eieio instruction
9  * to prevent reordering. This is not included in functions below (performance
10  * reasons) and must be called explicitly. Function eieio() is defined in io.h.
11  */
12 
13 static inline uint8_t read8(const volatile void *addr)
14 {
15  uint8_t val;
16 
17  /* Set bit to ignore HRMOR */
18  addr = (const volatile void *)((uint64_t)addr | 0x8000000000000000);
19  asm volatile(
20  "lbzcix %0, 0, %1" :
21  "=r"(val) : "r"(addr));
22 
23  return val;
24 }
25 
26 static inline uint16_t read16(const volatile void *addr)
27 {
28  uint16_t val;
29 
30  /* Set bit to ignore HRMOR */
31  addr = (const volatile void *)((uint64_t)addr | 0x8000000000000000);
32  asm volatile(
33  "lhzcix %0, 0, %1" :
34  "=r"(val) : "r"(addr));
35 
36  return val;
37 }
38 
39 static inline uint32_t read32(const volatile void *addr)
40 {
41  uint32_t val;
42 
43  /* Set bit to ignore HRMOR */
44  addr = (const volatile void *)((uint64_t)addr | 0x8000000000000000);
45  asm volatile(
46  "lwzcix %0, 0, %1" :
47  "=r"(val) : "r"(addr));
48 
49  return val;
50 }
51 
52 static inline uint64_t read64(const volatile void *addr)
53 {
54  uint64_t val;
55 
56  /* Set bit to ignore HRMOR */
57  addr = (const volatile void *)((uint64_t)addr | 0x8000000000000000);
58  asm volatile(
59  "ldcix %0, 0, %1" :
60  "=r"(val) : "r"(addr));
61 
62  return val;
63 }
64 
65 static inline void write8(volatile void *addr, uint8_t val)
66 {
67  /* Set bit to ignore HRMOR */
68  addr = (volatile void *)((uint64_t)addr | 0x8000000000000000);
69  asm volatile(
70  "stbcix %0, 0, %1" ::
71  "r"(val), "r"(addr));
72 }
73 
74 static inline void write16(volatile void *addr, uint16_t val)
75 {
76  /* Set bit to ignore HRMOR */
77  addr = (volatile void *)((uint64_t)addr | 0x8000000000000000);
78  asm volatile(
79  "sthcix %0, 0, %1" ::
80  "r"(val), "r"(addr));
81 }
82 
83 static inline void write32(volatile void *addr, uint32_t val)
84 {
85  /* Set bit to ignore HRMOR */
86  addr = (volatile void *)((uint64_t)addr | 0x8000000000000000);
87  asm volatile(
88  "stwcix %0, 0, %1" ::
89  "r"(val), "r"(addr));
90 }
91 
92 static inline void write64(volatile void *addr, uint64_t val)
93 {
94  /* Set bit to ignore HRMOR */
95  addr = (volatile void *)((uint64_t)addr | 0x8000000000000000);
96  asm volatile(
97  "stdcix %0, 0, %1" ::
98  "r"(val), "r"(addr));
99 }
100 
101 #endif /* __ARCH_MMIO_H__ */
void write64(void *addr, uint64_t val)
uint64_t read64(const void *addr)
static uint32_t read32(const volatile void *addr)
Definition: mmio.h:39
static void write16(volatile void *addr, uint16_t val)
Definition: mmio.h:74
static uint16_t read16(const volatile void *addr)
Definition: mmio.h:26
static void write32(volatile void *addr, uint32_t val)
Definition: mmio.h:83
static uint8_t read8(const volatile void *addr)
Definition: mmio.h:13
static void write8(volatile void *addr, uint8_t val)
Definition: mmio.h:65
static u32 addr
Definition: cirrus.c:14
unsigned short uint16_t
Definition: stdint.h:11
unsigned int uint32_t
Definition: stdint.h:14
unsigned long long uint64_t
Definition: stdint.h:17
unsigned char uint8_t
Definition: stdint.h:8
u8 val
Definition: sys.c:300