1 /* $NetBSD: io.c,v 1.4 2006/06/27 23:26:13 garbled Exp $ */ 2 3 /*- 4 * Copyright (C) 1995-1997 Gary Thomas (gdt@linuxppc.org) 5 * All rights reserved. 6 * 7 * PCI/ISA I/O support 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Gary Thomas. 20 * 4. The name of the author may not be used to endorse or promote products 21 * derived from this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 #include <lib/libsa/stand.h> 36 #include <sys/bswap.h> 37 #include "boot.h" 38 39 #define PCI_NSLOTS 8 40 #define PCI_NREGS 5 41 #define PCI_DEVID 0 42 #define PCI_CMD 1 43 #define PCI_CLASS 2 44 #define PCI_MEMBASE 4 45 46 47 volatile u_char *ISA_io = (u_char *)0x80000000; 48 volatile u_char *ISA_mem = (u_char *)0xc0000000; 49 volatile char *videomem = (char *)0xc00b8000; /* + vram offset */ 50 51 struct PCI_cinfo { 52 u_long *config_addr; 53 u_long regs[PCI_NREGS]; 54 } PCI_slots[PCI_NSLOTS] = { 55 { (u_long *)0x80808000, {0xDEADBEEF,} }, 56 { (u_long *)0x80800800, {0xDEADBEEF,} }, 57 { (u_long *)0x80801000, {0xDEADBEEF,} }, 58 { (u_long *)0x80802000, {0xDEADBEEF,} }, 59 { (u_long *)0x80804000, {0xDEADBEEF,} }, 60 { (u_long *)0x80810000, {0xDEADBEEF,} }, 61 { (u_long *)0x80820000, {0xDEADBEEF,} }, 62 { (u_long *)0x80840000, {0xDEADBEEF,} }, 63 }; 64 65 void 66 outb(int port, char val) 67 { 68 69 ISA_io[port] = val; 70 } 71 72 inline void 73 outw(int port, u_int16_t val) 74 { 75 outb(port, val>>8); 76 outb(port+1, val); 77 } 78 79 u_char 80 inb(int port) 81 { 82 83 return (ISA_io[port]); 84 } 85 86 u_long 87 local_to_PCI(u_long addr) 88 { 89 90 return ((addr & 0x7FFFFFFF) | 0x80000000); 91 } 92 93 void 94 unlockVideo(int slot) 95 { 96 volatile u_int8_t *ppci; 97 98 ppci = (u_int8_t *)PCI_slots[slot].config_addr; 99 ppci[4] = 0x0003; /* enable memory and IO Access */ 100 #if 0 101 ppci[0x10] = 0x00000; /* Turn off memory mapping */ 102 ppci[0x11] = 0x00000; /* mem base = 0 */ 103 ppci[0x12] = 0x00000; 104 ppci[0x13] = 0x00000; 105 #endif 106 __asm__ volatile("eieio"); 107 108 outb(0x3d4, 0x11); 109 outb(0x3d5, 0x0e); /* unlock CR0-CR7 */ 110 } 111 112 int 113 scan_PCI(int start) 114 { 115 int slot, r; 116 struct PCI_cinfo *pslot; 117 int VGAslot = -1; 118 int highVGAslot = 0; 119 120 for (slot = start + 1; slot < PCI_NSLOTS; slot++) { 121 pslot = &PCI_slots[slot]; 122 for (r = 0; r < PCI_NREGS; r++) 123 pslot->regs[r] = bswap32(pslot->config_addr[r]); 124 if (pslot->regs[PCI_DEVID] != 0xffffffff) { 125 /* we have a card */ 126 if (((pslot->regs[PCI_CLASS] & 0xffffff00) == 127 0x03000000) || 128 ((pslot->regs[PCI_CLASS] & 0xffffff00) == 129 0x00010000)) { 130 /* it's a VGA card */ 131 highVGAslot = slot; 132 if ((pslot->regs[PCI_CMD] & 0x03)) { 133 /* fW enabled it */ 134 VGAslot = slot; 135 break; 136 } 137 } 138 } 139 } 140 return VGAslot; 141 } 142 143 int 144 PCI_vendor(int slotnum) 145 { 146 struct PCI_cinfo *pslot = &PCI_slots[slotnum]; 147 148 return (pslot->regs[PCI_DEVID] & 0xffff); 149 } 150