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