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