]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/pc98/pc98/pc98_machdep.c
This commit was generated by cvs2svn to compensate for changes in r157571,
[FreeBSD/FreeBSD.git] / sys / pc98 / pc98 / pc98_machdep.c
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$
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 #ifdef EPSON_MEMWIN
42 #include <pc98/cbus/cbus.h>
43 #endif
44 #include <pc98/pc98/pc98_machdep.h>
45
46 /*
47  * Initialize DMA controller
48  */
49 void
50 pc98_init_dmac(void)
51 {
52         outb(0x439, (inb(0x439) & 0xfb));       /* DMA Accsess Control over 1MB */
53         outb(0x29, (0x0c | 0));                         /* Bank Mode Reg. 16M mode */
54         outb(0x29, (0x0c | 1));                         /* Bank Mode Reg. 16M mode */
55         outb(0x29, (0x0c | 2));                         /* Bank Mode Reg. 16M mode */
56         outb(0x29, (0x0c | 3));                         /* Bank Mode Reg. 16M mode */
57         outb(0x11, 0x50);
58 }
59
60 #ifdef EPSON_MEMWIN
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  */
67 static void
68 init_epson_memwin(void)
69 {
70         /* Disable 15MB-16MB caching. */
71         switch (epson_machine_id) {
72         case EPSON_PC486_HX:
73         case EPSON_PC486_HG:
74         case EPSON_PC486_HA:
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 EPSON_PC486_GR:
96         case EPSON_PC486_P:
97         case EPSON_PC486_GR_SUPER:
98         case EPSON_PC486_GR_PLUS:
99         case EPSON_PC486_SE:
100         case EPSON_PC486_SR:
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  */
120 unsigned int
121 pc98_getmemsize(unsigned int *base, unsigned int *ext)
122 {
123         unsigned int under16, 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                 init_epson_memwin();
136         }
137 #endif
138
139         /* available protected memory size over 16MB / 1MB */
140         over16  = PC98_SYSTEM_PARAMETER(0x594);
141         over16 += PC98_SYSTEM_PARAMETER(0x595) * 256;
142
143         if (over16 > 0)
144                 *ext = (16 + over16) * 1024 - 1024;
145         else
146                 *ext = under16 - 1024;
147
148         return (under16);
149 }
150
151 /*
152  * Read a geometry information of SCSI HDD from BIOS work area.
153  *
154  * XXX - Before reading BIOS work area, we should check whether
155  * host adapter support it.
156  */
157 int
158 scsi_da_bios_params(struct ccb_calc_geometry *ccg)
159 {
160         u_char *tmp;
161         int     target;
162
163         target = ccg->ccb_h.target_id;
164         tmp = (u_char *)&PC98_SYSTEM_PARAMETER(0x460 + target*4);
165         if ((PC98_SYSTEM_PARAMETER(0x482) & ((1 << target)&0xff)) != 0) {
166                 ccg->secs_per_track = *tmp;
167                 ccg->cylinders = ((*(tmp+3)<<8)|*(tmp+2))&0xfff;
168 #if 0
169                 switch (*(tmp + 3) & 0x30) {
170                 case 0x00:
171                         disk_parms->secsiz = 256;
172                         printf("Warning!: not supported.\n");
173                         break;
174                 case 0x10:
175                         disk_parms->secsiz = 512;
176                         break;
177                 case 0x20:
178                         disk_parms->secsiz = 1024;
179                         break;
180                 default:
181                         disk_parms->secsiz = 512;
182                         printf("Warning!: not supported. But force to 512\n");
183                         break;
184                 }
185 #endif
186                 if (*(tmp+3) & 0x40) {
187                         ccg->cylinders += (*(tmp+1)&0xf0)<<8;
188                         ccg->heads = *(tmp+1)&0x0f;
189                 } else {
190                         ccg->heads = *(tmp+1);
191                 }
192                 return (1);
193         }
194
195         return (0);
196 }