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