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