blob: 739a17cae5f2f5444874f8d6764ab7ad191bdcdb [file] [log] [blame]
Jason Jina63ce952007-07-06 08:34:56 +08001/****************************************************************************
2*
Wolfgang Denk96bb2e02007-08-06 02:17:36 +02003* BIOS emulator and interface
4* to Realmode X86 Emulator Library
Jason Jina63ce952007-07-06 08:34:56 +08005*
Kumar Gala6a6d9482009-07-28 21:49:52 -05006* Copyright (C) 2007 Freescale Semiconductor, Inc.
Jason Jina63ce952007-07-06 08:34:56 +08007* Jason Jin <Jason.jin@freescale.com>
8*
Wolfgang Denk96bb2e02007-08-06 02:17:36 +02009* Copyright (C) 1996-1999 SciTech Software, Inc.
Jason Jina63ce952007-07-06 08:34:56 +080010*
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
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020019* without specific, written prior permission. The authors makes no
Jason Jina63ce952007-07-06 08:34:56 +080020* 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*
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020033* Language: ANSI C
34* Environment: Any
35* Developer: Kendall Bennett
Jason Jina63ce952007-07-06 08:34:56 +080036*
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020037* Description: Internal header file for the BIOS emulator library.
Jason Jina63ce952007-07-06 08:34:56 +080038*
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020039* Jason ported this file to u-boot, Added some architecture
40* related Macro.
Jason Jina63ce952007-07-06 08:34:56 +080041*
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
Simon Glassd8414fc2014-11-14 20:56:42 -070051#ifdef CONFIG_X86EMU_DEBUG
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020052#define DB(x) x
Jason Jina63ce952007-07-06 08:34:56 +080053#else
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020054#define DB(x) do{}while(0);
Jason Jina63ce952007-07-06 08:34:56 +080055#endif
56
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020057#define BIOS_SEG 0xfff0
Jason Jina63ce952007-07-06 08:34:56 +080058extern X86EMU_sysEnv _X86EMU_env;
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020059#define M _X86EMU_env
Jason Jina63ce952007-07-06 08:34:56 +080060
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__
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020067#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))
Jason Jina63ce952007-07-06 08:34:56 +080071#define writeb_le(base, v) *((u8*)(base)) = (v)
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020072#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)
Jason Jina63ce952007-07-06 08:34:56 +080078#else
Wolfgang Denk96bb2e02007-08-06 02:17:36 +020079#define readb_le(base) *((u8*)(base))
80#define readw_le(base) *((u16*)(base))
81#define readl_le(base) *((u32*)(base))
Jason Jina63ce952007-07-06 08:34:56 +080082#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:
Wolfgang Denk96bb2e02007-08-06 02:17:36 +0200121type - Type of port access (1 = byte, 2 = word, 3 = dword)
122defVal - Default power on value
Jason Jina63ce952007-07-06 08:34:56 +0800123finalVal - Final value
124****************************************************************************/
125typedef struct {
126 u8 type;
127 u32 defVal;
128 u32 finalVal;
129} BE_portInfo;
130
Yuri Zaporozhetsed944ea2024-11-05 22:30:49 +0100131#if defined(X86EMU_RAW_IO)
Simon Glass9306f9f2023-07-15 21:38:39 -0600132#define PM_inpb(port) inb(port)
133#define PM_inpw(port) inw(port)
134#define PM_inpd(port) inl(port)
135#define PM_outpb(port, val) outb(val, port)
136#define PM_outpw(port, val) outw(val, port)
137#define PM_outpd(port, val) outl(val, port)
Jason Jina63ce952007-07-06 08:34:56 +0800138
Yuri Zaporozhetsed944ea2024-11-05 22:30:49 +0100139#else
140
141/*
142 * Until the emulator code is fixed, at least print warnings.
143 */
144
145static inline u8 PM_inpb(u16 port)
146{
147 printf("x86 port 0x%x read attempt, returning 0\n", port);
148 return 0;
149}
150
151static inline u16 PM_inpw(u16 port)
152{
153 printf("x86 port 0x%x read attempt, returning 0\n", port);
154 return 0;
155}
156
157static inline u32 PM_inpd(u16 port)
158{
159 printf("x86 port 0x%x read attempt, returning 0\n", port);
160 return 0;
161}
162
163static inline void PM_outpb(u16 port, u8 val)
164{
165 printf("x86 port 0x%x write attempt, ignoring\n", port);
166}
167
168static inline void PM_outpw(u16 port, u16 val)
169{
170 printf("x86 port 0x%x write attempt, ignoring\n", port);
171}
172
173static inline void PM_outpd(u16 port, u32 val)
174{
175 printf("x86 port 0x%x write attempt, ignoring\n", port);
176}
177#endif
178
Jason Jina63ce952007-07-06 08:34:56 +0800179#define LOG_inpb(port) PM_inpb(port)
180#define LOG_inpw(port) PM_inpw(port)
181#define LOG_inpd(port) PM_inpd(port)
Simon Glass9306f9f2023-07-15 21:38:39 -0600182#define LOG_outpb(port, val) PM_outpb(port, val)
183#define LOG_outpw(port, val) PM_outpw(port, val)
184#define LOG_outpd(port, val) PM_outpd(port, val)
Jason Jina63ce952007-07-06 08:34:56 +0800185
186/*-------------------------- Function Prototypes --------------------------*/
187
188/* bios.c */
189
190void _BE_bios_init(u32 * intrTab);
191void _BE_setup_funcs(void);
192
193/* besys.c */
194#define DEBUG_IO() (M.x86.debug & DEBUG_IO_TRACE_F)
195
196u8 X86API BE_rdb(u32 addr);
197u16 X86API BE_rdw(u32 addr);
198u32 X86API BE_rdl(u32 addr);
199void X86API BE_wrb(u32 addr, u8 val);
200void X86API BE_wrw(u32 addr, u16 val);
201void X86API BE_wrl(u32 addr, u32 val);
202
203u8 X86API BE_inb(X86EMU_pioAddr port);
204u16 X86API BE_inw(X86EMU_pioAddr port);
205u32 X86API BE_inl(X86EMU_pioAddr port);
206void X86API BE_outb(X86EMU_pioAddr port, u8 val);
207void X86API BE_outw(X86EMU_pioAddr port, u16 val);
208void X86API BE_outl(X86EMU_pioAddr port, u32 val);
209#endif
210/* __BIOSEMUI_H */