Import upstream u-boot 1.1.4
[u-boot.git] / board / MAI / bios_emulator / scitech / src / v86bios / mem.c
1 /*
2  * Copyright 1999 Egbert Eich
3  *
4  * Permission to use, copy, modify, distribute, and sell this software and its
5  * documentation for any purpose is hereby granted without fee, provided that
6  * the above copyright notice appear in all copies and that both that
7  * copyright notice and this permission notice appear in supporting
8  * documentation, and that the name of the authors not be used in
9  * advertising or publicity pertaining to distribution of the software without
10  * specific, written prior permission.  The authors makes no representations
11  * about the suitability of this software for any purpose.  It is provided
12  * "as is" without express or implied warranty.
13  *
14  * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16  * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20  * PERFORMANCE OF THIS SOFTWARE.
21  */
22 #include "debug.h"
23 #include "v86bios.h"
24 #include "x86emu.h"
25
26 #ifdef __alpha__
27
28 void* vram_map = 0;
29 int sparse_shift = 5;
30
31 #define mem_barrier()        __asm__ __volatile__("mb"  : : : "memory")
32
33 #define vuip    volatile unsigned int *
34
35 CARD8
36 mem_rb(CARD32 addr)
37 {
38   unsigned long result, shift;
39 #if 1
40   if (addr >= 0xA0000 && addr <= 0xBFFFF) {
41     addr -= 0xA0000;
42     shift = (addr & 0x3) * 8;
43     result = *(vuip) ((unsigned long)vram_map + (addr << sparse_shift));
44     result >>= shift;
45     return 0xffUL & result;
46   } else
47 #endif
48     return rdb(addr);
49 }
50
51 CARD16
52 mem_rw(CARD32 addr)
53 {
54   unsigned long result, shift;
55 #if 1
56   if (addr >= 0xA0000 && addr <= 0xBFFFF) {
57     addr -= 0xA0000;
58     shift = (addr & 0x2) * 8;
59     result = *(vuip)((unsigned long)vram_map+(addr<<sparse_shift)
60              +(1<<(sparse_shift-2)));
61     result >>= shift;
62     return 0xffffUL & result;
63   } else
64 #endif
65     return rdw(addr);
66 }
67
68 CARD32
69 mem_rl(CARD32 addr)
70 {
71   unsigned long result;
72 #if 1
73   if (addr >= 0xA0000 && addr <= 0xBFFFF) {
74     addr -= 0xA0000;
75     result = *(vuip)((unsigned long)vram_map+(addr<<sparse_shift)+(3<<(sparse_shift-2)));
76     return result;
77   } else
78 #endif
79     return rdl(addr);
80 }
81
82 void
83 mem_wb(CARD32 addr, CARD8 val)
84 {
85     unsigned int b = val & 0xffU;
86 #if 1
87   if (addr >= 0xA0000 && addr <= 0xBFFFF) {
88     addr -= 0xA0000;
89     *(vuip) ((unsigned long)vram_map + (addr << sparse_shift)) = b * 0x01010101;
90     mem_barrier();
91   } else
92 #endif
93     wrb(addr,val);
94 }
95
96 void
97 mem_ww(CARD32 addr, CARD16 val)
98 {
99   unsigned int w = val & 0xffffU;
100 #if 1
101   if (addr >= 0xA0000 && addr <= 0xBFFFF) {
102     addr -= 0xA0000;
103     *(vuip)((unsigned long)vram_map+(addr<<sparse_shift)
104         +(1<<(sparse_shift-2))) = w * 0x00010001;
105     mem_barrier();
106   } else
107 #endif
108     wrw(addr,val);
109 }
110
111 void
112 mem_wl(CARD32 addr, CARD32 val)
113 {
114 #if 1
115   if (addr >= 0xA0000 && addr <= 0xBFFFF) {
116     addr -= 0xA0000;
117     *(vuip)((unsigned long)vram_map+(addr<<sparse_shift)
118         +(3<<(sparse_shift-2))) = val;
119     mem_barrier();
120   } else
121 #endif
122     wrl(addr,val);
123 }
124 #endif