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