xref: /aosp_15_r20/external/arm-trusted-firmware/include/lib/mmio.h (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  */
6*54fd6939SJiyong Park 
7*54fd6939SJiyong Park #ifndef MMIO_H
8*54fd6939SJiyong Park #define MMIO_H
9*54fd6939SJiyong Park 
10*54fd6939SJiyong Park #include <stdint.h>
11*54fd6939SJiyong Park 
mmio_write_8(uintptr_t addr,uint8_t value)12*54fd6939SJiyong Park static inline void mmio_write_8(uintptr_t addr, uint8_t value)
13*54fd6939SJiyong Park {
14*54fd6939SJiyong Park 	*(volatile uint8_t*)addr = value;
15*54fd6939SJiyong Park }
16*54fd6939SJiyong Park 
mmio_read_8(uintptr_t addr)17*54fd6939SJiyong Park static inline uint8_t mmio_read_8(uintptr_t addr)
18*54fd6939SJiyong Park {
19*54fd6939SJiyong Park 	return *(volatile uint8_t*)addr;
20*54fd6939SJiyong Park }
21*54fd6939SJiyong Park 
mmio_write_16(uintptr_t addr,uint16_t value)22*54fd6939SJiyong Park static inline void mmio_write_16(uintptr_t addr, uint16_t value)
23*54fd6939SJiyong Park {
24*54fd6939SJiyong Park 	*(volatile uint16_t*)addr = value;
25*54fd6939SJiyong Park }
26*54fd6939SJiyong Park 
mmio_read_16(uintptr_t addr)27*54fd6939SJiyong Park static inline uint16_t mmio_read_16(uintptr_t addr)
28*54fd6939SJiyong Park {
29*54fd6939SJiyong Park 	return *(volatile uint16_t*)addr;
30*54fd6939SJiyong Park }
31*54fd6939SJiyong Park 
mmio_clrsetbits_16(uintptr_t addr,uint16_t clear,uint16_t set)32*54fd6939SJiyong Park static inline void mmio_clrsetbits_16(uintptr_t addr,
33*54fd6939SJiyong Park 				uint16_t clear,
34*54fd6939SJiyong Park 				uint16_t set)
35*54fd6939SJiyong Park {
36*54fd6939SJiyong Park 	mmio_write_16(addr, (mmio_read_16(addr) & ~clear) | set);
37*54fd6939SJiyong Park }
38*54fd6939SJiyong Park 
mmio_write_32(uintptr_t addr,uint32_t value)39*54fd6939SJiyong Park static inline void mmio_write_32(uintptr_t addr, uint32_t value)
40*54fd6939SJiyong Park {
41*54fd6939SJiyong Park 	*(volatile uint32_t*)addr = value;
42*54fd6939SJiyong Park }
43*54fd6939SJiyong Park 
mmio_read_32(uintptr_t addr)44*54fd6939SJiyong Park static inline uint32_t mmio_read_32(uintptr_t addr)
45*54fd6939SJiyong Park {
46*54fd6939SJiyong Park 	return *(volatile uint32_t*)addr;
47*54fd6939SJiyong Park }
48*54fd6939SJiyong Park 
mmio_write_64(uintptr_t addr,uint64_t value)49*54fd6939SJiyong Park static inline void mmio_write_64(uintptr_t addr, uint64_t value)
50*54fd6939SJiyong Park {
51*54fd6939SJiyong Park 	*(volatile uint64_t*)addr = value;
52*54fd6939SJiyong Park }
53*54fd6939SJiyong Park 
mmio_read_64(uintptr_t addr)54*54fd6939SJiyong Park static inline uint64_t mmio_read_64(uintptr_t addr)
55*54fd6939SJiyong Park {
56*54fd6939SJiyong Park 	return *(volatile uint64_t*)addr;
57*54fd6939SJiyong Park }
58*54fd6939SJiyong Park 
mmio_clrbits_32(uintptr_t addr,uint32_t clear)59*54fd6939SJiyong Park static inline void mmio_clrbits_32(uintptr_t addr, uint32_t clear)
60*54fd6939SJiyong Park {
61*54fd6939SJiyong Park 	mmio_write_32(addr, mmio_read_32(addr) & ~clear);
62*54fd6939SJiyong Park }
63*54fd6939SJiyong Park 
mmio_setbits_32(uintptr_t addr,uint32_t set)64*54fd6939SJiyong Park static inline void mmio_setbits_32(uintptr_t addr, uint32_t set)
65*54fd6939SJiyong Park {
66*54fd6939SJiyong Park 	mmio_write_32(addr, mmio_read_32(addr) | set);
67*54fd6939SJiyong Park }
68*54fd6939SJiyong Park 
mmio_clrsetbits_32(uintptr_t addr,uint32_t clear,uint32_t set)69*54fd6939SJiyong Park static inline void mmio_clrsetbits_32(uintptr_t addr,
70*54fd6939SJiyong Park 				uint32_t clear,
71*54fd6939SJiyong Park 				uint32_t set)
72*54fd6939SJiyong Park {
73*54fd6939SJiyong Park 	mmio_write_32(addr, (mmio_read_32(addr) & ~clear) | set);
74*54fd6939SJiyong Park }
75*54fd6939SJiyong Park 
76*54fd6939SJiyong Park #endif /* MMIO_H */
77