pc98_machdep.c revision 58145
1/* 2 * Copyright (c) KATO Takenori, 1996, 1997. 3 * 4 * All rights reserved. Unpublished rights reserved under the copyright 5 * laws of Japan. 6 * 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer as 13 * the first lines of this file unmodified. 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. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 * 31 * $FreeBSD: head/sys/pc98/pc98/pc98_machdep.c 58145 2000-03-16 12:14:00Z nyan $ 32 */ 33 34#include "opt_pc98.h" 35 36#include <sys/param.h> 37#include <sys/systm.h> 38 39#include <cam/cam.h> 40#include <cam/cam_ccb.h> 41 42#include <pc98/pc98/pc98_machdep.h> 43 44/* 45 * Initialize DMA controller 46 */ 47void 48pc98_init_dmac(void) 49{ 50 outb(0x439, (inb(0x439) & 0xfb)); /* DMA Accsess Control over 1MB */ 51 outb(0x29, (0x0c | 0)); /* Bank Mode Reg. 16M mode */ 52 outb(0x29, (0x0c | 1)); /* Bank Mode Reg. 16M mode */ 53 outb(0x29, (0x0c | 2)); /* Bank Mode Reg. 16M mode */ 54 outb(0x29, (0x0c | 3)); /* Bank Mode Reg. 16M mode */ 55 outb(0x11, 0x50); 56} 57 58#ifdef EPSON_MEMWIN 59static void init_epson_memwin __P((void)); 60 61/* 62 * Disconnect phisical memory in 15-16MB region. 63 * 64 * EPSON PC-486GR, P, SR, SE, HX, HG and HA only. Other system support 65 * this feature with software DIP switch. 66 */ 67static void 68init_epson_memwin(void) 69{ 70 /* Disable 15MB-16MB caching. */ 71 switch (epson_machine_id) { 72 case 0x34: /* PC486HX */ 73 case 0x35: /* PC486HG */ 74 case 0x3B: /* PC486HA */ 75 /* Cache control start. */ 76 outb(0x43f, 0x42); 77 outw(0xc40, 0x0033); 78 79 /* Disable 0xF00000-0xFFFFFF. */ 80 outb(0xc48, 0x49); 81 outb(0xc4c, 0x00); 82 outb(0xc48, 0x48); 83 outb(0xc4c, 0xf0); 84 outb(0xc48, 0x4d); 85 outb(0xc4c, 0x00); 86 outb(0xc48, 0x4c); 87 outb(0xc4c, 0xff); 88 outb(0xc48, 0x4f); 89 outb(0xc4c, 0x00); 90 91 /* Cache control end. */ 92 outb(0x43f, 0x40); 93 break; 94 95 case 0x2B: /* PC486GR/GF */ 96 case 0x30: /* PC486P */ 97 case 0x31: /* PC486GRSuper */ 98 case 0x32: /* PC486GR+ */ 99 case 0x37: /* PC486SE */ 100 case 0x38: /* PC486SR */ 101 /* Disable 0xF00000-0xFFFFFF. */ 102 outb(0x43f, 0x42); 103 outb(0x467, 0xe0); 104 outb(0x567, 0xd8); 105 106 outb(0x43f, 0x40); 107 outb(0x467, 0xe0); 108 outb(0x567, 0xe0); 109 break; 110 } 111 112 /* Disable 15MB-16MB RAM and enable memory window. */ 113 outb(0x43b, inb(0x43b) & 0xfd); /* Clear bit1. */ 114} 115#endif 116 117/* 118 * Get physical memory size 119 */ 120void 121pc98_getmemsize(unsigned *base, unsigned *ext, unsigned *under16) 122{ 123 unsigned int over16; 124 125 /* available conventional memory size */ 126 *base = ((PC98_SYSTEM_PARAMETER(0x501) & 7) + 1) * 128; 127 128 /* available protected memory size under 16MB */ 129 *under16 = PC98_SYSTEM_PARAMETER(0x401) * 128 + 1024; 130#ifdef EPSON_MEMWIN 131 if (pc98_machine_type & M_EPSON_PC98) { 132 if (*under16 > (15 * 1024)) { 133 /* chop under16 memory to 15MB */ 134 *under16 = 15 * 1024; 135 } 136 init_epson_memwin(); 137 } 138#endif 139 140 /* available protected memory size over 16MB / 1MB */ 141 over16 = PC98_SYSTEM_PARAMETER(0x594); 142 over16 += PC98_SYSTEM_PARAMETER(0x595) * 256; 143 144 *ext = *under16; 145 if (over16 > 0) { 146 *ext = (16 + over16) * 1024; 147 } 148} 149 150#include "da.h" 151 152/* 153 * Read a geometry information of SCSI HDD from BIOS work area. 154 * 155 * XXX - Before reading BIOS work area, we should check whether 156 * host adapter support it. 157 */ 158int 159scsi_da_bios_params(struct ccb_calc_geometry *ccg) 160{ 161#if NDA > 0 162 u_char *tmp; 163 int target; 164 int bus; 165 166 target = ccg->ccb_h.target_id; 167 bus = 0; /* If your really need to know, send a PathInq CCB */ 168 169 tmp = (u_char *)&PC98_SYSTEM_PARAMETER(0x460 + target*4); 170 if ((PC98_SYSTEM_PARAMETER(0x482) & ((1 << target)&0xff)) != 0) { 171 ccg->secs_per_track = *tmp; 172 ccg->cylinders = ((*(tmp+3)<<8)|*(tmp+2))&0xfff; 173#if 0 174 switch (*(tmp + 3) & 0x30) { 175 case 0x00: 176 disk_parms->secsiz = 256; 177 printf("Warning!: not supported.\n"); 178 break; 179 case 0x10: 180 disk_parms->secsiz = 512; 181 break; 182 case 0x20: 183 disk_parms->secsiz = 1024; 184 break; 185 default: 186 disk_parms->secsiz = 512; 187 printf("Warning!: not supported. But force to 512\n"); 188 break; 189 } 190#endif 191 if (*(tmp+3) & 0x40) { 192 ccg->cylinders += (*(tmp+1)&0xf0)<<8; 193 ccg->heads = *(tmp+1)&0x0f; 194 } else { 195 ccg->heads = *(tmp+1); 196 } 197 return 1; 198 } 199#endif /* NDA > 0 */ 200 return 0; 201} 202