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