xref: /rk3399_rockchip-uboot/drivers/bios_emulator/include/biosemu.h (revision ece92f85053b8df613edcf05b26a416cbc3d629c)
1*ece92f85SJason Jin /****************************************************************************
2*ece92f85SJason Jin *
3*ece92f85SJason Jin *                        BIOS emulator and interface
4*ece92f85SJason Jin *                      to Realmode X86 Emulator Library
5*ece92f85SJason Jin *
6*ece92f85SJason Jin *               Copyright (C) 1996-1999 SciTech Software, Inc.
7*ece92f85SJason Jin *
8*ece92f85SJason Jin *  ========================================================================
9*ece92f85SJason Jin *
10*ece92f85SJason Jin *  Permission to use, copy, modify, distribute, and sell this software and
11*ece92f85SJason Jin *  its documentation for any purpose is hereby granted without fee,
12*ece92f85SJason Jin *  provided that the above copyright notice appear in all copies and that
13*ece92f85SJason Jin *  both that copyright notice and this permission notice appear in
14*ece92f85SJason Jin *  supporting documentation, and that the name of the authors not be used
15*ece92f85SJason Jin *  in advertising or publicity pertaining to distribution of the software
16*ece92f85SJason Jin *  without specific, written prior permission.  The authors makes no
17*ece92f85SJason Jin *  representations about the suitability of this software for any purpose.
18*ece92f85SJason Jin *  It is provided "as is" without express or implied warranty.
19*ece92f85SJason Jin *
20*ece92f85SJason Jin *  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
21*ece92f85SJason Jin *  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
22*ece92f85SJason Jin *  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
23*ece92f85SJason Jin *  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
24*ece92f85SJason Jin *  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
25*ece92f85SJason Jin *  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
26*ece92f85SJason Jin *  PERFORMANCE OF THIS SOFTWARE.
27*ece92f85SJason Jin *
28*ece92f85SJason Jin *  ========================================================================
29*ece92f85SJason Jin *
30*ece92f85SJason Jin * Language:     ANSI C
31*ece92f85SJason Jin * Environment:  Any
32*ece92f85SJason Jin * Developer:    Kendall Bennett
33*ece92f85SJason Jin *
34*ece92f85SJason Jin * Description:  Header file for the real mode x86 BIOS emulator, which is
35*ece92f85SJason Jin *               used to warmboot any number of VGA compatible PCI/AGP
36*ece92f85SJason Jin *               controllers under any OS, on any processor family that
37*ece92f85SJason Jin *               supports PCI. We also allow the user application to call
38*ece92f85SJason Jin *               real mode BIOS functions and Int 10h functions (including
39*ece92f85SJason Jin *               the VESA BIOS).
40*ece92f85SJason Jin *
41*ece92f85SJason Jin ****************************************************************************/
42*ece92f85SJason Jin 
43*ece92f85SJason Jin #ifndef __BIOSEMU_H
44*ece92f85SJason Jin #define __BIOSEMU_H
45*ece92f85SJason Jin 
46*ece92f85SJason Jin #ifdef __KERNEL__
47*ece92f85SJason Jin #include "x86emu.h"
48*ece92f85SJason Jin #else
49*ece92f85SJason Jin #include "x86emu.h"
50*ece92f85SJason Jin #include "pmapi.h"
51*ece92f85SJason Jin #include "pcilib.h"
52*ece92f85SJason Jin #endif
53*ece92f85SJason Jin 
54*ece92f85SJason Jin /*---------------------- Macros and type definitions ----------------------*/
55*ece92f85SJason Jin 
56*ece92f85SJason Jin #pragma pack(1)
57*ece92f85SJason Jin 
58*ece92f85SJason Jin #ifndef __KERNEL__
59*ece92f85SJason Jin /****************************************************************************
60*ece92f85SJason Jin REMARKS:
61*ece92f85SJason Jin Data structure used to describe the details specific to a particular VGA
62*ece92f85SJason Jin controller. This information is used to allow the VGA controller to be
63*ece92f85SJason Jin swapped on the fly within the BIOS emulator.
64*ece92f85SJason Jin 
65*ece92f85SJason Jin HEADER:
66*ece92f85SJason Jin biosemu.h
67*ece92f85SJason Jin 
68*ece92f85SJason Jin MEMBERS:
69*ece92f85SJason Jin pciInfo         - PCI device information block for the controller
70*ece92f85SJason Jin BIOSImage       - Pointer to a read/write copy of the BIOS image
71*ece92f85SJason Jin BIOSImageLen    - Length of the BIOS image
72*ece92f85SJason Jin LowMem          - Copy of key low memory areas
73*ece92f85SJason Jin ****************************************************************************/
74*ece92f85SJason Jin typedef struct {
75*ece92f85SJason Jin 	PCIDeviceInfo *pciInfo;
76*ece92f85SJason Jin 	void *BIOSImage;
77*ece92f85SJason Jin 	ulong BIOSImageLen;
78*ece92f85SJason Jin 	uchar LowMem[1536];
79*ece92f85SJason Jin } BE_VGAInfo;
80*ece92f85SJason Jin #else
81*ece92f85SJason Jin /****************************************************************************
82*ece92f85SJason Jin REMARKS:
83*ece92f85SJason Jin Data structure used to describe the details for the BIOS emulator system
84*ece92f85SJason Jin environment as used by the X86 emulator library.
85*ece92f85SJason Jin 
86*ece92f85SJason Jin HEADER:
87*ece92f85SJason Jin biosemu.h
88*ece92f85SJason Jin 
89*ece92f85SJason Jin MEMBERS:
90*ece92f85SJason Jin vgaInfo         - VGA BIOS information structure
91*ece92f85SJason Jin biosmem_base    - Base of the BIOS image
92*ece92f85SJason Jin biosmem_limit   - Limit of the BIOS image
93*ece92f85SJason Jin busmem_base     - Base of the VGA bus memory
94*ece92f85SJason Jin ****************************************************************************/
95*ece92f85SJason Jin typedef struct {
96*ece92f85SJason Jin 	int function;
97*ece92f85SJason Jin 	int device;
98*ece92f85SJason Jin 	int bus;
99*ece92f85SJason Jin 	u32 VendorID;
100*ece92f85SJason Jin 	u32 DeviceID;
101*ece92f85SJason Jin 	pci_dev_t pcidev;
102*ece92f85SJason Jin 	void *BIOSImage;
103*ece92f85SJason Jin 	u32 BIOSImageLen;
104*ece92f85SJason Jin 	u8 LowMem[1536];
105*ece92f85SJason Jin } BE_VGAInfo;
106*ece92f85SJason Jin 
107*ece92f85SJason Jin #endif				/* __KERNEL__ */
108*ece92f85SJason Jin 
109*ece92f85SJason Jin #define CRT_C   24		/* 24  CRT Controller Registers             */
110*ece92f85SJason Jin #define ATT_C   21		/* 21  Attribute Controller Registers       */
111*ece92f85SJason Jin #define GRA_C   9		/* 9   Graphics Controller Registers        */
112*ece92f85SJason Jin #define SEQ_C   5		/* 5   Sequencer Registers                  */
113*ece92f85SJason Jin #define PAL_C   768		/* 768 Palette Registers                    */
114*ece92f85SJason Jin 
115*ece92f85SJason Jin /****************************************************************************
116*ece92f85SJason Jin REMARKS:
117*ece92f85SJason Jin Data structure used to describe the details for the BIOS emulator system
118*ece92f85SJason Jin environment as used by the X86 emulator library.
119*ece92f85SJason Jin 
120*ece92f85SJason Jin HEADER:
121*ece92f85SJason Jin biosemu.h
122*ece92f85SJason Jin 
123*ece92f85SJason Jin MEMBERS:
124*ece92f85SJason Jin vgaInfo         - VGA BIOS information structure
125*ece92f85SJason Jin biosmem_base    - Base of the BIOS image
126*ece92f85SJason Jin biosmem_limit   - Limit of the BIOS image
127*ece92f85SJason Jin busmem_base     - Base of the VGA bus memory
128*ece92f85SJason Jin timer           - Timer used to emulate PC timer ports
129*ece92f85SJason Jin timer0          - Latched value for timer 0
130*ece92f85SJason Jin timer0Latched   - True if timer 0 value was just latched
131*ece92f85SJason Jin timer2          - Current value for timer 2
132*ece92f85SJason Jin emulateVGA      - True to emulate VGA I/O and memory accesses
133*ece92f85SJason Jin ****************************************************************************/
134*ece92f85SJason Jin 
135*ece92f85SJason Jin typedef struct {
136*ece92f85SJason Jin 	BE_VGAInfo vgaInfo;
137*ece92f85SJason Jin 	ulong biosmem_base;
138*ece92f85SJason Jin 	ulong biosmem_limit;
139*ece92f85SJason Jin 	ulong busmem_base;
140*ece92f85SJason Jin 
141*ece92f85SJason Jin 	u32 timer0;
142*ece92f85SJason Jin 	int timer0Latched;
143*ece92f85SJason Jin 	u32 timer1;
144*ece92f85SJason Jin 	int timer1Latched;
145*ece92f85SJason Jin 	u32 timer2;
146*ece92f85SJason Jin 	int timer2Latched;
147*ece92f85SJason Jin 
148*ece92f85SJason Jin 	int emulateVGA;
149*ece92f85SJason Jin 	u8 emu61;
150*ece92f85SJason Jin 	u8 emu70;
151*ece92f85SJason Jin 	int flipFlop3C0;
152*ece92f85SJason Jin 	u32 configAddress;
153*ece92f85SJason Jin 	u8 emu3C0;
154*ece92f85SJason Jin 	u8 emu3C1[ATT_C];
155*ece92f85SJason Jin 	u8 emu3C2;
156*ece92f85SJason Jin 	u8 emu3C4;
157*ece92f85SJason Jin 	u8 emu3C5[SEQ_C];
158*ece92f85SJason Jin 	u8 emu3C6;
159*ece92f85SJason Jin 	uint emu3C7;
160*ece92f85SJason Jin 	uint emu3C8;
161*ece92f85SJason Jin 	u8 emu3C9[PAL_C];
162*ece92f85SJason Jin 	u8 emu3CE;
163*ece92f85SJason Jin 	u8 emu3CF[GRA_C];
164*ece92f85SJason Jin 	u8 emu3D4;
165*ece92f85SJason Jin 	u8 emu3D5[CRT_C];
166*ece92f85SJason Jin 	u8 emu3DA;
167*ece92f85SJason Jin 
168*ece92f85SJason Jin } BE_sysEnv;
169*ece92f85SJason Jin 
170*ece92f85SJason Jin #ifdef __KERNEL__
171*ece92f85SJason Jin 
172*ece92f85SJason Jin /* Define some types when compiling for the Linux kernel that normally
173*ece92f85SJason Jin  * come from the SciTech PM library.
174*ece92f85SJason Jin  */
175*ece92f85SJason Jin 
176*ece92f85SJason Jin /****************************************************************************
177*ece92f85SJason Jin REMARKS:
178*ece92f85SJason Jin Structure describing the 32-bit extended x86 CPU registers
179*ece92f85SJason Jin 
180*ece92f85SJason Jin HEADER:
181*ece92f85SJason Jin pmapi.h
182*ece92f85SJason Jin 
183*ece92f85SJason Jin MEMBERS:
184*ece92f85SJason Jin eax     - Value of the EAX register
185*ece92f85SJason Jin ebx     - Value of the EBX register
186*ece92f85SJason Jin ecx     - Value of the ECX register
187*ece92f85SJason Jin edx     - Value of the EDX register
188*ece92f85SJason Jin esi     - Value of the ESI register
189*ece92f85SJason Jin edi     - Value of the EDI register
190*ece92f85SJason Jin cflag   - Value of the carry flag
191*ece92f85SJason Jin ****************************************************************************/
192*ece92f85SJason Jin typedef struct {
193*ece92f85SJason Jin 	u32 eax;
194*ece92f85SJason Jin 	u32 ebx;
195*ece92f85SJason Jin 	u32 ecx;
196*ece92f85SJason Jin 	u32 edx;
197*ece92f85SJason Jin 	u32 esi;
198*ece92f85SJason Jin 	u32 edi;
199*ece92f85SJason Jin 	u32 cflag;
200*ece92f85SJason Jin } RMDWORDREGS;
201*ece92f85SJason Jin 
202*ece92f85SJason Jin /****************************************************************************
203*ece92f85SJason Jin REMARKS:
204*ece92f85SJason Jin Structure describing the 16-bit x86 CPU registers
205*ece92f85SJason Jin 
206*ece92f85SJason Jin HEADER:
207*ece92f85SJason Jin pmapi.h
208*ece92f85SJason Jin 
209*ece92f85SJason Jin MEMBERS:
210*ece92f85SJason Jin ax      - Value of the AX register
211*ece92f85SJason Jin bx      - Value of the BX register
212*ece92f85SJason Jin cx      - Value of the CX register
213*ece92f85SJason Jin dx      - Value of the DX register
214*ece92f85SJason Jin si      - Value of the SI register
215*ece92f85SJason Jin di      - Value of the DI register
216*ece92f85SJason Jin cflag   - Value of the carry flag
217*ece92f85SJason Jin ****************************************************************************/
218*ece92f85SJason Jin #ifdef __BIG_ENDIAN__
219*ece92f85SJason Jin typedef struct {
220*ece92f85SJason Jin 	u16 ax_hi, ax;
221*ece92f85SJason Jin 	u16 bx_hi, bx;
222*ece92f85SJason Jin 	u16 cx_hi, cx;
223*ece92f85SJason Jin 	u16 dx_hi, dx;
224*ece92f85SJason Jin 	u16 si_hi, si;
225*ece92f85SJason Jin 	u16 di_hi, di;
226*ece92f85SJason Jin 	u16 cflag_hi, cflag;
227*ece92f85SJason Jin } RMWORDREGS;
228*ece92f85SJason Jin #else
229*ece92f85SJason Jin typedef struct {
230*ece92f85SJason Jin 	u16 ax, ax_hi;
231*ece92f85SJason Jin 	u16 bx, bx_hi;
232*ece92f85SJason Jin 	u16 cx, cx_hi;
233*ece92f85SJason Jin 	u16 dx, dx_hi;
234*ece92f85SJason Jin 	u16 si, si_hi;
235*ece92f85SJason Jin 	u16 di, di_hi;
236*ece92f85SJason Jin 	u16 cflag, cflag_hi;
237*ece92f85SJason Jin } RMWORDREGS;
238*ece92f85SJason Jin #endif
239*ece92f85SJason Jin 
240*ece92f85SJason Jin /****************************************************************************
241*ece92f85SJason Jin REMARKS:
242*ece92f85SJason Jin Structure describing the 8-bit x86 CPU registers
243*ece92f85SJason Jin 
244*ece92f85SJason Jin HEADER:
245*ece92f85SJason Jin pmapi.h
246*ece92f85SJason Jin 
247*ece92f85SJason Jin MEMBERS:
248*ece92f85SJason Jin al      - Value of the AL register
249*ece92f85SJason Jin ah      - Value of the AH register
250*ece92f85SJason Jin bl      - Value of the BL register
251*ece92f85SJason Jin bh      - Value of the BH register
252*ece92f85SJason Jin cl      - Value of the CL register
253*ece92f85SJason Jin ch      - Value of the CH register
254*ece92f85SJason Jin dl      - Value of the DL register
255*ece92f85SJason Jin dh      - Value of the DH register
256*ece92f85SJason Jin ****************************************************************************/
257*ece92f85SJason Jin #ifdef __BIG_ENDIAN__
258*ece92f85SJason Jin typedef struct {
259*ece92f85SJason Jin 	u16 ax_hi;
260*ece92f85SJason Jin 	u8 ah, al;
261*ece92f85SJason Jin 	u16 bx_hi;
262*ece92f85SJason Jin 	u8 bh, bl;
263*ece92f85SJason Jin 	u16 cx_hi;
264*ece92f85SJason Jin 	u8 ch, cl;
265*ece92f85SJason Jin 	u16 dx_hi;
266*ece92f85SJason Jin 	u8 dh, dl;
267*ece92f85SJason Jin } RMBYTEREGS;
268*ece92f85SJason Jin #else
269*ece92f85SJason Jin typedef struct {
270*ece92f85SJason Jin 	u8 al;
271*ece92f85SJason Jin 	u8 ah;
272*ece92f85SJason Jin 	u16 ax_hi;
273*ece92f85SJason Jin 	u8 bl;
274*ece92f85SJason Jin 	u8 bh;
275*ece92f85SJason Jin 	u16 bx_hi;
276*ece92f85SJason Jin 	u8 cl;
277*ece92f85SJason Jin 	u8 ch;
278*ece92f85SJason Jin 	u16 cx_hi;
279*ece92f85SJason Jin 	u8 dl;
280*ece92f85SJason Jin 	u8 dh;
281*ece92f85SJason Jin 	u16 dx_hi;
282*ece92f85SJason Jin } RMBYTEREGS;
283*ece92f85SJason Jin #endif
284*ece92f85SJason Jin 
285*ece92f85SJason Jin /****************************************************************************
286*ece92f85SJason Jin REMARKS:
287*ece92f85SJason Jin Structure describing all the x86 CPU registers
288*ece92f85SJason Jin 
289*ece92f85SJason Jin HEADER:
290*ece92f85SJason Jin pmapi.h
291*ece92f85SJason Jin 
292*ece92f85SJason Jin MEMBERS:
293*ece92f85SJason Jin e   - Member to access registers as 32-bit values
294*ece92f85SJason Jin x   - Member to access registers as 16-bit values
295*ece92f85SJason Jin h   - Member to access registers as 8-bit values
296*ece92f85SJason Jin ****************************************************************************/
297*ece92f85SJason Jin typedef union {
298*ece92f85SJason Jin 	RMDWORDREGS e;
299*ece92f85SJason Jin 	RMWORDREGS x;
300*ece92f85SJason Jin 	RMBYTEREGS h;
301*ece92f85SJason Jin } RMREGS;
302*ece92f85SJason Jin 
303*ece92f85SJason Jin /****************************************************************************
304*ece92f85SJason Jin REMARKS:
305*ece92f85SJason Jin Structure describing all the x86 segment registers
306*ece92f85SJason Jin 
307*ece92f85SJason Jin HEADER:
308*ece92f85SJason Jin pmapi.h
309*ece92f85SJason Jin 
310*ece92f85SJason Jin MEMBERS:
311*ece92f85SJason Jin es  - ES segment register
312*ece92f85SJason Jin cs  - CS segment register
313*ece92f85SJason Jin ss  - SS segment register
314*ece92f85SJason Jin ds  - DS segment register
315*ece92f85SJason Jin fs  - FS segment register
316*ece92f85SJason Jin gs  - GS segment register
317*ece92f85SJason Jin ****************************************************************************/
318*ece92f85SJason Jin typedef struct {
319*ece92f85SJason Jin 	u16 es;
320*ece92f85SJason Jin 	u16 cs;
321*ece92f85SJason Jin 	u16 ss;
322*ece92f85SJason Jin 	u16 ds;
323*ece92f85SJason Jin 	u16 fs;
324*ece92f85SJason Jin 	u16 gs;
325*ece92f85SJason Jin } RMSREGS;
326*ece92f85SJason Jin 
327*ece92f85SJason Jin #endif				/* __KERNEL__ */
328*ece92f85SJason Jin 
329*ece92f85SJason Jin #ifndef __KERNEL__
330*ece92f85SJason Jin 
331*ece92f85SJason Jin /****************************************************************************
332*ece92f85SJason Jin REMARKS:
333*ece92f85SJason Jin Structure defining all the BIOS Emulator API functions as exported from
334*ece92f85SJason Jin the Binary Portable DLL.
335*ece92f85SJason Jin {secret}
336*ece92f85SJason Jin ****************************************************************************/
337*ece92f85SJason Jin typedef struct {
338*ece92f85SJason Jin 	ulong dwSize;
339*ece92f85SJason Jin 	 ibool(PMAPIP BE_init) (u32 debugFlags, int memSize, BE_VGAInfo * info);
340*ece92f85SJason Jin 	void (PMAPIP BE_setVGA) (BE_VGAInfo * info);
341*ece92f85SJason Jin 	void (PMAPIP BE_getVGA) (BE_VGAInfo * info);
342*ece92f85SJason Jin 	void *(PMAPIP BE_mapRealPointer) (uint r_seg, uint r_off);
343*ece92f85SJason Jin 	void *(PMAPIP BE_getVESABuf) (uint * len, uint * rseg, uint * roff);
344*ece92f85SJason Jin 	void (PMAPIP BE_callRealMode) (uint seg, uint off, RMREGS * regs,
345*ece92f85SJason Jin 				       RMSREGS * sregs);
346*ece92f85SJason Jin 	int (PMAPIP BE_int86) (int intno, RMREGS * in, RMREGS * out);
347*ece92f85SJason Jin 	int (PMAPIP BE_int86x) (int intno, RMREGS * in, RMREGS * out,
348*ece92f85SJason Jin 				RMSREGS * sregs);
349*ece92f85SJason Jin 	void *reserved1;
350*ece92f85SJason Jin 	void (PMAPIP BE_exit) (void);
351*ece92f85SJason Jin } BE_exports;
352*ece92f85SJason Jin 
353*ece92f85SJason Jin /****************************************************************************
354*ece92f85SJason Jin REMARKS:
355*ece92f85SJason Jin Function pointer type for the Binary Portable DLL initialisation entry point.
356*ece92f85SJason Jin {secret}
357*ece92f85SJason Jin ****************************************************************************/
358*ece92f85SJason Jin typedef BE_exports *(PMAPIP BE_initLibrary_t) (PM_imports * PMImp);
359*ece92f85SJason Jin #endif
360*ece92f85SJason Jin 
361*ece92f85SJason Jin #pragma pack()
362*ece92f85SJason Jin 
363*ece92f85SJason Jin /*---------------------------- Global variables ---------------------------*/
364*ece92f85SJason Jin 
365*ece92f85SJason Jin #ifdef  __cplusplus
366*ece92f85SJason Jin extern "C" {			/* Use "C" linkage when in C++ mode */
367*ece92f85SJason Jin #endif
368*ece92f85SJason Jin 
369*ece92f85SJason Jin /* {secret} Global BIOS emulator system environment */
370*ece92f85SJason Jin 	extern BE_sysEnv _BE_env;
371*ece92f85SJason Jin 
372*ece92f85SJason Jin /*-------------------------- Function Prototypes --------------------------*/
373*ece92f85SJason Jin 
374*ece92f85SJason Jin /* BIOS emulator library entry points */
375*ece92f85SJason Jin 	int X86API BE_init(u32 debugFlags, int memSize, BE_VGAInfo * info,
376*ece92f85SJason Jin 			   int shared);
377*ece92f85SJason Jin 	void X86API BE_setVGA(BE_VGAInfo * info);
378*ece92f85SJason Jin 	void X86API BE_getVGA(BE_VGAInfo * info);
379*ece92f85SJason Jin 	void X86API BE_setDebugFlags(u32 debugFlags);
380*ece92f85SJason Jin 	void *X86API BE_mapRealPointer(uint r_seg, uint r_off);
381*ece92f85SJason Jin 	void *X86API BE_getVESABuf(uint * len, uint * rseg, uint * roff);
382*ece92f85SJason Jin 	void X86API BE_callRealMode(uint seg, uint off, RMREGS * regs,
383*ece92f85SJason Jin 				    RMSREGS * sregs);
384*ece92f85SJason Jin 	int X86API BE_int86(int intno, RMREGS * in, RMREGS * out);
385*ece92f85SJason Jin 	int X86API BE_int86x(int intno, RMREGS * in, RMREGS * out,
386*ece92f85SJason Jin 			     RMSREGS * sregs);
387*ece92f85SJason Jin 	void X86API BE_exit(void);
388*ece92f85SJason Jin 
389*ece92f85SJason Jin #ifdef  __cplusplus
390*ece92f85SJason Jin }				/* End of "C" linkage for C++       */
391*ece92f85SJason Jin #endif
392*ece92f85SJason Jin #endif				/* __BIOSEMU_H */
393