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) 2007 Freescale Semiconductor, Inc. All rights reserved.
7*ece92f85SJason Jin *  Jason Jin <Jason.jin@freescale.com>
8*ece92f85SJason Jin *
9*ece92f85SJason Jin *               Copyright (C) 1996-1999 SciTech Software, Inc.
10*ece92f85SJason Jin *
11*ece92f85SJason Jin *  ========================================================================
12*ece92f85SJason Jin *
13*ece92f85SJason Jin *  Permission to use, copy, modify, distribute, and sell this software and
14*ece92f85SJason Jin *  its documentation for any purpose is hereby granted without fee,
15*ece92f85SJason Jin *  provided that the above copyright notice appear in all copies and that
16*ece92f85SJason Jin *  both that copyright notice and this permission notice appear in
17*ece92f85SJason Jin *  supporting documentation, and that the name of the authors not be used
18*ece92f85SJason Jin *  in advertising or publicity pertaining to distribution of the software
19*ece92f85SJason Jin *  without specific, written prior permission.  The authors makes no
20*ece92f85SJason Jin *  representations about the suitability of this software for any purpose.
21*ece92f85SJason Jin *  It is provided "as is" without express or implied warranty.
22*ece92f85SJason Jin *
23*ece92f85SJason Jin *  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
24*ece92f85SJason Jin *  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
25*ece92f85SJason Jin *  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
26*ece92f85SJason Jin *  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
27*ece92f85SJason Jin *  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
28*ece92f85SJason Jin *  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
29*ece92f85SJason Jin *  PERFORMANCE OF THIS SOFTWARE.
30*ece92f85SJason Jin *
31*ece92f85SJason Jin *  ========================================================================
32*ece92f85SJason Jin *
33*ece92f85SJason Jin * Language:     ANSI C
34*ece92f85SJason Jin * Environment:  Any
35*ece92f85SJason Jin * Developer:    Kendall Bennett
36*ece92f85SJason Jin *
37*ece92f85SJason Jin * Description:  Internal header file for the BIOS emulator library.
38*ece92f85SJason Jin *
39*ece92f85SJason Jin * 		Jason ported this file to u-boot, Added some architecture
40*ece92f85SJason Jin * 		related Macro.
41*ece92f85SJason Jin *
42*ece92f85SJason Jin ****************************************************************************/
43*ece92f85SJason Jin 
44*ece92f85SJason Jin #ifndef __BIOSEMUI_H
45*ece92f85SJason Jin #define __BIOSEMUI_H
46*ece92f85SJason Jin 
47*ece92f85SJason Jin #include "biosemu.h"
48*ece92f85SJason Jin #include <asm/io.h>
49*ece92f85SJason Jin /*---------------------- Macros and type definitions ----------------------*/
50*ece92f85SJason Jin 
51*ece92f85SJason Jin #ifdef DEBUG
52*ece92f85SJason Jin #define DB(x)   x
53*ece92f85SJason Jin #else
54*ece92f85SJason Jin #define DB(x)   do{}while(0);
55*ece92f85SJason Jin #endif
56*ece92f85SJason Jin 
57*ece92f85SJason Jin #define BIOS_SEG        0xfff0
58*ece92f85SJason Jin extern X86EMU_sysEnv _X86EMU_env;
59*ece92f85SJason Jin #define M               _X86EMU_env
60*ece92f85SJason Jin 
61*ece92f85SJason Jin /* Macros to read and write values to x86 emulator memory. Memory is always
62*ece92f85SJason Jin  * considered to be little endian, so we use macros to do endian swapping
63*ece92f85SJason Jin  * where necessary.
64*ece92f85SJason Jin  */
65*ece92f85SJason Jin 
66*ece92f85SJason Jin #ifdef __BIG_ENDIAN__
67*ece92f85SJason Jin #define readb_le(base)      *((u8*)(base))
68*ece92f85SJason Jin #define readw_le(base)      ((u16)readb_le(base) | ((u16)readb_le((base) + 1) << 8))
69*ece92f85SJason Jin #define readl_le(base)      ((u32)readb_le((base) + 0) | ((u32)readb_le((base) + 1) << 8) | \
70*ece92f85SJason Jin                             ((u32)readb_le((base) + 2) << 16) | ((u32)readb_le((base) + 3) << 24))
71*ece92f85SJason Jin #define writeb_le(base, v)  *((u8*)(base)) = (v)
72*ece92f85SJason Jin #define writew_le(base, v)  writeb_le(base + 0, (v >> 0) & 0xff),       \
73*ece92f85SJason Jin                             writeb_le(base + 1, (v >> 8) & 0xff)
74*ece92f85SJason Jin #define writel_le(base, v)  writeb_le(base + 0, (v >> 0) & 0xff),       \
75*ece92f85SJason Jin                             writeb_le(base + 1, (v >> 8) & 0xff),       \
76*ece92f85SJason Jin                             writeb_le(base + 2, (v >> 16) & 0xff),      \
77*ece92f85SJason Jin                             writeb_le(base + 3, (v >> 24) & 0xff)
78*ece92f85SJason Jin #else
79*ece92f85SJason Jin #define readb_le(base)      *((u8*)(base))
80*ece92f85SJason Jin #define readw_le(base)      *((u16*)(base))
81*ece92f85SJason Jin #define readl_le(base)      *((u32*)(base))
82*ece92f85SJason Jin #define writeb_le(base, v)  *((u8*)(base)) = (v)
83*ece92f85SJason Jin #define writew_le(base, v)  *((u16*)(base)) = (v)
84*ece92f85SJason Jin #define writel_le(base, v)  *((u32*)(base)) = (v)
85*ece92f85SJason Jin #endif
86*ece92f85SJason Jin 
87*ece92f85SJason Jin /****************************************************************************
88*ece92f85SJason Jin REMARKS:
89*ece92f85SJason Jin Function codes passed to the emulated I/O port functions to determine the
90*ece92f85SJason Jin type of operation to perform.
91*ece92f85SJason Jin ****************************************************************************/
92*ece92f85SJason Jin typedef enum {
93*ece92f85SJason Jin 	REG_READ_BYTE = 0,
94*ece92f85SJason Jin 	REG_READ_WORD = 1,
95*ece92f85SJason Jin 	REG_READ_DWORD = 2,
96*ece92f85SJason Jin 	REG_WRITE_BYTE = 3,
97*ece92f85SJason Jin 	REG_WRITE_WORD = 4,
98*ece92f85SJason Jin 	REG_WRITE_DWORD = 5
99*ece92f85SJason Jin } RegisterFlags;
100*ece92f85SJason Jin 
101*ece92f85SJason Jin /****************************************************************************
102*ece92f85SJason Jin REMARKS:
103*ece92f85SJason Jin Function codes passed to the emulated I/O port functions to determine the
104*ece92f85SJason Jin type of operation to perform.
105*ece92f85SJason Jin ****************************************************************************/
106*ece92f85SJason Jin typedef enum {
107*ece92f85SJason Jin 	PORT_BYTE = 1,
108*ece92f85SJason Jin 	PORT_WORD = 2,
109*ece92f85SJason Jin 	PORT_DWORD = 3,
110*ece92f85SJason Jin } PortInfoFlags;
111*ece92f85SJason Jin 
112*ece92f85SJason Jin /****************************************************************************
113*ece92f85SJason Jin REMARKS:
114*ece92f85SJason Jin Data structure used to describe the details for the BIOS emulator system
115*ece92f85SJason Jin environment as used by the X86 emulator library.
116*ece92f85SJason Jin 
117*ece92f85SJason Jin HEADER:
118*ece92f85SJason Jin biosemu.h
119*ece92f85SJason Jin 
120*ece92f85SJason Jin MEMBERS:
121*ece92f85SJason Jin type        - Type of port access (1 = byte, 2 = word, 3 = dword)
122*ece92f85SJason Jin defVal      - Default power on value
123*ece92f85SJason Jin finalVal    - Final value
124*ece92f85SJason Jin ****************************************************************************/
125*ece92f85SJason Jin typedef struct {
126*ece92f85SJason Jin 	u8 type;
127*ece92f85SJason Jin 	u32 defVal;
128*ece92f85SJason Jin 	u32 finalVal;
129*ece92f85SJason Jin } BE_portInfo;
130*ece92f85SJason Jin 
131*ece92f85SJason Jin #define PM_inpb(port)	inb(port+VIDEO_IO_OFFSET)
132*ece92f85SJason Jin #define PM_inpw(port)	inw(port+VIDEO_IO_OFFSET)
133*ece92f85SJason Jin #define PM_inpd(port)	inl(port+VIDEO_IO_OFFSET)
134*ece92f85SJason Jin #define PM_outpb(port,val)	outb(val,port+VIDEO_IO_OFFSET)
135*ece92f85SJason Jin #define PM_outpw(port,val)	outw(val,port+VIDEO_IO_OFFSET)
136*ece92f85SJason Jin #define PM_outpd(port,val)	outl(val,port+VIDEO_IO_OFFSET)
137*ece92f85SJason Jin 
138*ece92f85SJason Jin #define LOG_inpb(port)	PM_inpb(port)
139*ece92f85SJason Jin #define LOG_inpw(port)	PM_inpw(port)
140*ece92f85SJason Jin #define LOG_inpd(port)	PM_inpd(port)
141*ece92f85SJason Jin #define LOG_outpb(port,val)	PM_outpb(port,val)
142*ece92f85SJason Jin #define LOG_outpw(port,val)	PM_outpw(port,val)
143*ece92f85SJason Jin #define LOG_outpd(port,val)	PM_outpd(port,val)
144*ece92f85SJason Jin 
145*ece92f85SJason Jin /*-------------------------- Function Prototypes --------------------------*/
146*ece92f85SJason Jin 
147*ece92f85SJason Jin /* bios.c */
148*ece92f85SJason Jin 
149*ece92f85SJason Jin void _BE_bios_init(u32 * intrTab);
150*ece92f85SJason Jin void _BE_setup_funcs(void);
151*ece92f85SJason Jin 
152*ece92f85SJason Jin /* besys.c */
153*ece92f85SJason Jin #define DEBUG_IO()	(M.x86.debug & DEBUG_IO_TRACE_F)
154*ece92f85SJason Jin 
155*ece92f85SJason Jin u8 X86API BE_rdb(u32 addr);
156*ece92f85SJason Jin u16 X86API BE_rdw(u32 addr);
157*ece92f85SJason Jin u32 X86API BE_rdl(u32 addr);
158*ece92f85SJason Jin void X86API BE_wrb(u32 addr, u8 val);
159*ece92f85SJason Jin void X86API BE_wrw(u32 addr, u16 val);
160*ece92f85SJason Jin void X86API BE_wrl(u32 addr, u32 val);
161*ece92f85SJason Jin 
162*ece92f85SJason Jin u8 X86API BE_inb(X86EMU_pioAddr port);
163*ece92f85SJason Jin u16 X86API BE_inw(X86EMU_pioAddr port);
164*ece92f85SJason Jin u32 X86API BE_inl(X86EMU_pioAddr port);
165*ece92f85SJason Jin void X86API BE_outb(X86EMU_pioAddr port, u8 val);
166*ece92f85SJason Jin void X86API BE_outw(X86EMU_pioAddr port, u16 val);
167*ece92f85SJason Jin void X86API BE_outl(X86EMU_pioAddr port, u32 val);
168*ece92f85SJason Jin #endif
169*ece92f85SJason Jin /* __BIOSEMUI_H */
170