xref: /aosp_15_r20/external/pciutils/lib/physmem-access.h (revision c2e0c6b56a71da9abe8df5c8348fb3eb5c2c9251)
1*c2e0c6b5SAndroid Build Coastguard Worker /*
2*c2e0c6b5SAndroid Build Coastguard Worker  *      The PCI Library -- Compiler-specific wrappers for memory mapped I/O
3*c2e0c6b5SAndroid Build Coastguard Worker  *
4*c2e0c6b5SAndroid Build Coastguard Worker  *      Copyright (c) 2023 Pali Rohár <[email protected]>
5*c2e0c6b5SAndroid Build Coastguard Worker  *
6*c2e0c6b5SAndroid Build Coastguard Worker  *      Can be freely distributed and used under the terms of the GNU GPL v2+
7*c2e0c6b5SAndroid Build Coastguard Worker  *
8*c2e0c6b5SAndroid Build Coastguard Worker  *      SPDX-License-Identifier: GPL-2.0-or-later
9*c2e0c6b5SAndroid Build Coastguard Worker  */
10*c2e0c6b5SAndroid Build Coastguard Worker 
11*c2e0c6b5SAndroid Build Coastguard Worker /*
12*c2e0c6b5SAndroid Build Coastguard Worker  * FIXME
13*c2e0c6b5SAndroid Build Coastguard Worker  * Unfortunately gcc does not provide architecture independent way to read from
14*c2e0c6b5SAndroid Build Coastguard Worker  * or write to memory mapped I/O. The best approximation is to use volatile and
15*c2e0c6b5SAndroid Build Coastguard Worker  * for the write operation follow it by the read operation from the same address.
16*c2e0c6b5SAndroid Build Coastguard Worker  */
17*c2e0c6b5SAndroid Build Coastguard Worker 
18*c2e0c6b5SAndroid Build Coastguard Worker static inline void
physmem_writeb(unsigned char value,volatile void * ptr)19*c2e0c6b5SAndroid Build Coastguard Worker physmem_writeb(unsigned char value, volatile void *ptr)
20*c2e0c6b5SAndroid Build Coastguard Worker {
21*c2e0c6b5SAndroid Build Coastguard Worker   *(volatile unsigned char *)ptr = value;
22*c2e0c6b5SAndroid Build Coastguard Worker }
23*c2e0c6b5SAndroid Build Coastguard Worker 
24*c2e0c6b5SAndroid Build Coastguard Worker static inline void
physmem_writew(unsigned short value,volatile void * ptr)25*c2e0c6b5SAndroid Build Coastguard Worker physmem_writew(unsigned short value, volatile void *ptr)
26*c2e0c6b5SAndroid Build Coastguard Worker {
27*c2e0c6b5SAndroid Build Coastguard Worker   *(volatile unsigned short *)ptr = value;
28*c2e0c6b5SAndroid Build Coastguard Worker }
29*c2e0c6b5SAndroid Build Coastguard Worker 
30*c2e0c6b5SAndroid Build Coastguard Worker static inline void
physmem_writel(u32 value,volatile void * ptr)31*c2e0c6b5SAndroid Build Coastguard Worker physmem_writel(u32 value, volatile void *ptr)
32*c2e0c6b5SAndroid Build Coastguard Worker {
33*c2e0c6b5SAndroid Build Coastguard Worker   *(volatile u32 *)ptr = value;
34*c2e0c6b5SAndroid Build Coastguard Worker }
35*c2e0c6b5SAndroid Build Coastguard Worker 
36*c2e0c6b5SAndroid Build Coastguard Worker static inline unsigned char
physmem_readb(volatile void * ptr)37*c2e0c6b5SAndroid Build Coastguard Worker physmem_readb(volatile void *ptr)
38*c2e0c6b5SAndroid Build Coastguard Worker {
39*c2e0c6b5SAndroid Build Coastguard Worker   return *(volatile unsigned char *)ptr;
40*c2e0c6b5SAndroid Build Coastguard Worker }
41*c2e0c6b5SAndroid Build Coastguard Worker 
42*c2e0c6b5SAndroid Build Coastguard Worker static inline unsigned short
physmem_readw(volatile void * ptr)43*c2e0c6b5SAndroid Build Coastguard Worker physmem_readw(volatile void *ptr)
44*c2e0c6b5SAndroid Build Coastguard Worker {
45*c2e0c6b5SAndroid Build Coastguard Worker   return *(volatile unsigned short *)ptr;
46*c2e0c6b5SAndroid Build Coastguard Worker }
47*c2e0c6b5SAndroid Build Coastguard Worker 
48*c2e0c6b5SAndroid Build Coastguard Worker static inline u32
physmem_readl(volatile void * ptr)49*c2e0c6b5SAndroid Build Coastguard Worker physmem_readl(volatile void *ptr)
50*c2e0c6b5SAndroid Build Coastguard Worker {
51*c2e0c6b5SAndroid Build Coastguard Worker   return *(volatile u32 *)ptr;
52*c2e0c6b5SAndroid Build Coastguard Worker }
53