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