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