1 /* $NetBSD: io.c,v 1.1 2007/12/17 19:09:50 garbled Exp $ */ 2 3 4 #include <lib/libsa/stand.h> 5 #include <sys/bswap.h> 6 #include "boot.h" 7 8 #define POW_IOCC_SEG 0x820C00E0 9 #define IOCC_SEG 0x82000080 10 #define PSL_DR (1<<4) 11 12 volatile u_char *MCA_io = (u_char *)0xe0000000; 13 14 /* hardcode for now */ 15 int 16 setup_iocc(void) 17 { 18 register_t savemsr, msr; 19 20 __asm volatile ("mfmsr %0" : "=r"(savemsr)); 21 msr = savemsr & ~PSL_DR; 22 __asm volatile ("mtmsr %0" : : "r"(msr)); 23 24 __asm volatile ("mtsr 14,%0" : : "r"(IOCC_SEG)); 25 __asm volatile ("mtmsr %0" : : "r"(msr|PSL_DR)); 26 __asm volatile ("isync"); 27 __asm volatile ("mtmsr %0;isync" : : "r"(savemsr)); 28 return 1; 29 } 30 31 void 32 outb(int port, char val) 33 { 34 35 MCA_io[port] = val; 36 } 37 38 inline void 39 outw(int port, u_int16_t val) 40 { 41 outb(port, val>>8); 42 outb(port+1, val); 43 } 44 45 u_char 46 inb(int port) 47 { 48 49 return (MCA_io[port]); 50 } 51