xref: /rk3399_ARM-atf/include/lib/mmio.h (revision 4c700c1563aff7b51df95f17e952e050b9b4e37f)
14ecca339SDan Handley /*
2*4c700c15SGovindraj Raja  * Copyright (c) 2013-2014, Arm Limited and Contributors. All rights reserved.
34ecca339SDan Handley  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
54ecca339SDan Handley  */
64ecca339SDan Handley 
7c3cf06f1SAntonio Nino Diaz #ifndef MMIO_H
8c3cf06f1SAntonio Nino Diaz #define MMIO_H
94ecca339SDan Handley 
104ecca339SDan Handley #include <stdint.h>
114ecca339SDan Handley 
125e113753SAndrew Thoelke static inline void mmio_write_8(uintptr_t addr, uint8_t value)
135e113753SAndrew Thoelke {
145e113753SAndrew Thoelke 	*(volatile uint8_t*)addr = value;
155e113753SAndrew Thoelke }
164ecca339SDan Handley 
175e113753SAndrew Thoelke static inline uint8_t mmio_read_8(uintptr_t addr)
185e113753SAndrew Thoelke {
195e113753SAndrew Thoelke 	return *(volatile uint8_t*)addr;
205e113753SAndrew Thoelke }
214ecca339SDan Handley 
22fd904df1SJimmy Huang static inline void mmio_write_16(uintptr_t addr, uint16_t value)
23fd904df1SJimmy Huang {
24fd904df1SJimmy Huang 	*(volatile uint16_t*)addr = value;
25fd904df1SJimmy Huang }
26fd904df1SJimmy Huang 
27fd904df1SJimmy Huang static inline uint16_t mmio_read_16(uintptr_t addr)
28fd904df1SJimmy Huang {
29fd904df1SJimmy Huang 	return *(volatile uint16_t*)addr;
30fd904df1SJimmy Huang }
31fd904df1SJimmy Huang 
32d90256a7SKonstantin Porotchkin static inline void mmio_clrsetbits_16(uintptr_t addr,
33d90256a7SKonstantin Porotchkin 				uint16_t clear,
34d90256a7SKonstantin Porotchkin 				uint16_t set)
35d90256a7SKonstantin Porotchkin {
36d90256a7SKonstantin Porotchkin 	mmio_write_16(addr, (mmio_read_16(addr) & ~clear) | set);
37d90256a7SKonstantin Porotchkin }
38d90256a7SKonstantin Porotchkin 
395e113753SAndrew Thoelke static inline void mmio_write_32(uintptr_t addr, uint32_t value)
405e113753SAndrew Thoelke {
415e113753SAndrew Thoelke 	*(volatile uint32_t*)addr = value;
425e113753SAndrew Thoelke }
435e113753SAndrew Thoelke 
445e113753SAndrew Thoelke static inline uint32_t mmio_read_32(uintptr_t addr)
455e113753SAndrew Thoelke {
465e113753SAndrew Thoelke 	return *(volatile uint32_t*)addr;
475e113753SAndrew Thoelke }
485e113753SAndrew Thoelke 
495e113753SAndrew Thoelke static inline void mmio_write_64(uintptr_t addr, uint64_t value)
505e113753SAndrew Thoelke {
515e113753SAndrew Thoelke 	*(volatile uint64_t*)addr = value;
525e113753SAndrew Thoelke }
535e113753SAndrew Thoelke 
545e113753SAndrew Thoelke static inline uint64_t mmio_read_64(uintptr_t addr)
555e113753SAndrew Thoelke {
565e113753SAndrew Thoelke 	return *(volatile uint64_t*)addr;
575e113753SAndrew Thoelke }
584ecca339SDan Handley 
59fd904df1SJimmy Huang static inline void mmio_clrbits_32(uintptr_t addr, uint32_t clear)
60fd904df1SJimmy Huang {
61fd904df1SJimmy Huang 	mmio_write_32(addr, mmio_read_32(addr) & ~clear);
62fd904df1SJimmy Huang }
63fd904df1SJimmy Huang 
64fd904df1SJimmy Huang static inline void mmio_setbits_32(uintptr_t addr, uint32_t set)
65fd904df1SJimmy Huang {
66fd904df1SJimmy Huang 	mmio_write_32(addr, mmio_read_32(addr) | set);
67fd904df1SJimmy Huang }
68fd904df1SJimmy Huang 
69fd904df1SJimmy Huang static inline void mmio_clrsetbits_32(uintptr_t addr,
70fd904df1SJimmy Huang 				uint32_t clear,
71fd904df1SJimmy Huang 				uint32_t set)
72fd904df1SJimmy Huang {
73fd904df1SJimmy Huang 	mmio_write_32(addr, (mmio_read_32(addr) & ~clear) | set);
74fd904df1SJimmy Huang }
75fd904df1SJimmy Huang 
76c3cf06f1SAntonio Nino Diaz #endif /* MMIO_H */
77