xref: /netbsd/sys/arch/rs6000/stand/boot/io.c (revision 6550d01e)
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