xref: /netbsd-src/sys/arch/rs6000/stand/boot/io.c (revision 68fe5b6f0ada181498871fa776cde03e4a1ba5fc)
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*68fe5b6fSgarbled setup_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*68fe5b6fSgarbled outb(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*68fe5b6fSgarbled outw(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*68fe5b6fSgarbled inb(int port)
47*68fe5b6fSgarbled {
48*68fe5b6fSgarbled 
49*68fe5b6fSgarbled 	return (MCA_io[port]);
50*68fe5b6fSgarbled }
51