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 Workerphysmem_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 Workerphysmem_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 Workerphysmem_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 Workerphysmem_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 Workerphysmem_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 Workerphysmem_readl(volatile void *ptr) 50*c2e0c6b5SAndroid Build Coastguard Worker { 51*c2e0c6b5SAndroid Build Coastguard Worker return *(volatile u32 *)ptr; 52*c2e0c6b5SAndroid Build Coastguard Worker } 53