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