1*c2e0c6b5SAndroid Build Coastguard Worker /* 2*c2e0c6b5SAndroid Build Coastguard Worker * The PCI Library -- Access to i386 I/O ports on OpenBSD 3*c2e0c6b5SAndroid Build Coastguard Worker * 4*c2e0c6b5SAndroid Build Coastguard Worker * Copyright (c) 2023 Grant Pannell <[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. 7*c2e0c6b5SAndroid Build Coastguard Worker */ 8*c2e0c6b5SAndroid Build Coastguard Worker 9*c2e0c6b5SAndroid Build Coastguard Worker #include <sys/types.h> 10*c2e0c6b5SAndroid Build Coastguard Worker #include <machine/sysarch.h> 11*c2e0c6b5SAndroid Build Coastguard Worker #include <machine/pio.h> 12*c2e0c6b5SAndroid Build Coastguard Worker 13*c2e0c6b5SAndroid Build Coastguard Worker #include "i386-io-access.h" 14*c2e0c6b5SAndroid Build Coastguard Worker 15*c2e0c6b5SAndroid Build Coastguard Worker #if defined(__amd64__) 16*c2e0c6b5SAndroid Build Coastguard Worker #define obsd_iopl amd64_iopl 17*c2e0c6b5SAndroid Build Coastguard Worker #else 18*c2e0c6b5SAndroid Build Coastguard Worker #define obsd_iopl i386_iopl 19*c2e0c6b5SAndroid Build Coastguard Worker #endif 20*c2e0c6b5SAndroid Build Coastguard Worker 21*c2e0c6b5SAndroid Build Coastguard Worker static int iopl_enabled; 22*c2e0c6b5SAndroid Build Coastguard Worker 23*c2e0c6b5SAndroid Build Coastguard Worker static int intel_setup_io(struct pci_access * a UNUSED)24*c2e0c6b5SAndroid Build Coastguard Workerintel_setup_io(struct pci_access *a UNUSED) 25*c2e0c6b5SAndroid Build Coastguard Worker { 26*c2e0c6b5SAndroid Build Coastguard Worker if (iopl_enabled) 27*c2e0c6b5SAndroid Build Coastguard Worker return 1; 28*c2e0c6b5SAndroid Build Coastguard Worker 29*c2e0c6b5SAndroid Build Coastguard Worker if (obsd_iopl(3) < 0) 30*c2e0c6b5SAndroid Build Coastguard Worker { 31*c2e0c6b5SAndroid Build Coastguard Worker return 0; 32*c2e0c6b5SAndroid Build Coastguard Worker } 33*c2e0c6b5SAndroid Build Coastguard Worker 34*c2e0c6b5SAndroid Build Coastguard Worker iopl_enabled = 1; 35*c2e0c6b5SAndroid Build Coastguard Worker return 1; 36*c2e0c6b5SAndroid Build Coastguard Worker } 37*c2e0c6b5SAndroid Build Coastguard Worker 38*c2e0c6b5SAndroid Build Coastguard Worker static inline void intel_cleanup_io(struct pci_access * a UNUSED)39*c2e0c6b5SAndroid Build Coastguard Workerintel_cleanup_io(struct pci_access *a UNUSED) 40*c2e0c6b5SAndroid Build Coastguard Worker { 41*c2e0c6b5SAndroid Build Coastguard Worker if (iopl_enabled) 42*c2e0c6b5SAndroid Build Coastguard Worker { 43*c2e0c6b5SAndroid Build Coastguard Worker obsd_iopl(0); 44*c2e0c6b5SAndroid Build Coastguard Worker iopl_enabled = 0; 45*c2e0c6b5SAndroid Build Coastguard Worker } 46*c2e0c6b5SAndroid Build Coastguard Worker } 47*c2e0c6b5SAndroid Build Coastguard Worker intel_io_lock(void)48*c2e0c6b5SAndroid Build Coastguard Workerstatic inline void intel_io_lock(void) 49*c2e0c6b5SAndroid Build Coastguard Worker { 50*c2e0c6b5SAndroid Build Coastguard Worker } 51*c2e0c6b5SAndroid Build Coastguard Worker intel_io_unlock(void)52*c2e0c6b5SAndroid Build Coastguard Workerstatic inline void intel_io_unlock(void) 53*c2e0c6b5SAndroid Build Coastguard Worker { 54*c2e0c6b5SAndroid Build Coastguard Worker } 55