r7637@lvps87-230-33-50: verhaegs | 2008-04-19 15:05:06 +0200
[AROS.git] / arch / i386-pc / Drivers / vesa.hidd / hardware.c
blobaff7c8f3bbb16ddc364ea0067f7cc1fe147cc469
1 /*
2 Copyright © 1995-2002, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: vesa "hardware" functions
6 Lang: English
7 */
10 #define DEBUG 1 /* no SysBase */
11 #include <aros/asmcall.h>
12 #include <aros/debug.h>
13 #include <aros/macros.h>
14 #include <aros/bootloader.h>
15 #include <asm/io.h>
16 #include <proto/bootloader.h>
17 #include <proto/oop.h>
18 #include <utility/hooks.h>
19 #include <utility/tagitem.h>
20 #include <oop/oop.h>
21 #include <hidd/pci.h>
23 #include "bitmap.h"
24 #include "vesagfxclass.h"
25 #include "hardware.h"
27 #include <string.h>
29 #undef SysBase
30 extern struct ExecBase *SysBase;
31 OOP_AttrBase HiddPCIDeviceAttrBase;
32 static void Find_PCI_Card(struct HWData *sd);
34 unsigned char cursorPalette[] =
36 224, 64, 64,
37 0, 0, 0,
38 224, 224, 192
41 BOOL initVesaGfxHW(struct HWData *data)
43 struct BootLoaderBase *BootLoaderBase;
44 struct VesaInfo *vi;
45 int i, col;
47 if ((BootLoaderBase = OpenResource("bootloader.resource")))
49 D(bug("[Vesa] Init: Bootloader.resource opened\n"));
50 if ((vi = (struct VesaInfo *)GetBootInfo(BL_Video)))
52 D(bug("[Vesa] Init: Got Vesa structure from resource\n"));
53 if (vi->ModeNumber == 3)
55 D(bug("[Vesa] Init: Textmode was specified. Aborting\n"));
56 return FALSE;
58 data->width = vi->XSize; data->height = vi->YSize;
59 data->bitsperpixel = data->depth = vi->BitsPerPixel;
60 data->bytesperline = vi->BytesPerLine;
61 data->redmask = vi->Masks[VI_Red];
62 data->greenmask = vi->Masks[VI_Green];
63 data->bluemask = vi->Masks[VI_Blue];
64 data->redshift = vi->Shifts[VI_Red];
65 data->greenshift = vi->Shifts[VI_Green];
66 data->blueshift = vi->Shifts[VI_Blue];
67 data->framebuffer = vi->FrameBuffer;
68 data->palettewidth = vi->PaletteWidth;
70 if (!data->framebuffer)
71 Find_PCI_Card(data);
72 if (!data->framebuffer) {
73 D(bug("[Vesa] HwInit: Framebuffer not found\n"));
74 return FALSE;
77 if (data->depth > 24)
79 data->bytesperpixel = 4;
81 else if (data->depth > 16)
83 data->bytesperpixel = 3;
85 else if (data->depth > 8)
87 data->bytesperpixel = 2;
89 else
91 data->bytesperpixel = 1;
92 if (data->depth > 4)
93 col = 17;
94 else
95 col = (1 << data->depth) - 7;
96 for (i = 0; i < 9; i++)
97 data->DAC[col*3+i] = cursorPalette[i];
98 DACLoad(data, col, 3);
100 D(bug("[Vesa] HwInit: Clearing framebuffer at 0x%08x size %d KB\n",data->framebuffer, vi->FrameBufferSize));
101 memset(data->framebuffer, 0, vi->FrameBufferSize * 1024);
102 D(bug("[Vesa] HwInit: Linear framebuffer at 0x%08x\n",data->framebuffer));
103 D(bug("[Vesa] HwInit: Screenmode %dx%dx%d\n",data->width,data->height,data->depth));
104 D(bug("[Vesa] HwInit: Masks R %08x<<%2d G %08x<<%2d B %08x<<%2d\n",
105 data->redmask, data->redshift,
106 data->greenmask, data->greenshift,
107 data->bluemask, data->blueshift));
108 D(bug("[Vesa] HwInit: PaletteWidth %d\n", data->palettewidth));
109 D(bug("[vesa] HwInit: BytesPerPixel %d\n", data->bytesperpixel));
110 return TRUE;
114 bug("[Vesa] HwInit: No Vesa information from the bootloader. Failing\n");
115 return FALSE;
119 #if BUFFERED_VRAM
120 void vesaRefreshArea(struct BitmapData *data, LONG x1, LONG y1, LONG x2, LONG y2)
122 UBYTE *src, *dst;
123 ULONG srcmod, dstmod;
124 LONG x, y, w, h;
126 x1 *= data->bytesperpix;
127 x2 *= data->bytesperpix; x2 += data->bytesperpix - 1;
129 x1 &= ~3;
130 x2 = (x2 & ~3) + 3;
131 w = (x2 - x1) + 1;
132 h = (y2 - y1) + 1;
134 srcmod = (data->bytesperline - w);
135 dstmod = (data->data->bytesperline - w);
137 src = data->VideoData + y1 * data->bytesperline + x1;
138 dst = data->data->framebuffer + y1 * data->data->bytesperline + x1;
140 for(y = 0; y < h; y++)
142 for(x = 0; x < w / 4; x++)
144 *((ULONG *)dst) = *((ULONG *)src);
145 dst += sizeof(ULONG);
146 src += sizeof(ULONG);
148 src += srcmod;
149 dst += dstmod;
153 #endif
155 AROS_UFH3(void, Enumerator,
156 AROS_UFHA(struct Hook *, hook, A0),
157 AROS_UFHA(OOP_Object *, pciDevice, A2),
158 AROS_UFHA(APTR, message, A1))
160 AROS_USERFUNC_INIT
162 IPTR buf;
163 IPTR size;
164 IPTR Vendor;
165 OOP_Object *driver;
166 struct pHidd_PCIDriver_MapPCI mappci,*msg = &mappci;
167 struct HWData *sd = hook->h_Data;
169 D(bug("[VESA] Enumerator: Found deivce\n"));
171 OOP_GetAttr(pciDevice, aHidd_PCIDevice_Driver, (APTR)&driver);
172 OOP_GetAttr(pciDevice, aHidd_PCIDevice_VendorID, (APTR)&Vendor);
173 OOP_GetAttr(pciDevice, aHidd_PCIDevice_Base0, (APTR)&buf);
174 OOP_GetAttr(pciDevice, aHidd_PCIDevice_Size0, (APTR)&size);
176 /* BIOS of S3 video cards may forget to set up linear framebuffer start address.
177 Here we do this manually.
178 This thing was looked up in x.org S3 driver source code. Applicable to all S3 cards. */
179 if (Vendor == PCI_VENDOR_S3) {
180 outb(0x59, vgaIOBase + 4);
181 outb(buf >> 24, vgaIOBase + 5);
182 outb(0x5A, vgaIOBase + 4);
183 outb(buf >> 16, vgaIOBase + 5);
186 mappci.mID = OOP_GetMethodID(IID_Hidd_PCIDriver, moHidd_PCIDriver_MapPCI);
187 mappci.PCIAddress = buf;
188 mappci.Length = size;
189 sd->framebuffer = (APTR)OOP_DoMethod(driver, (OOP_Msg)msg);
191 D(bug("[VESA] Got framebuffer @ %x (size=%x)\n", sd->framebuffer, size));
193 AROS_USERFUNC_EXIT
196 #undef sd
197 static void Find_PCI_Card(struct HWData *sd)
199 OOP_Object *pci;
201 D(bug("[VESA] Find_PCI_Card\n"));
203 if (HiddPCIDeviceAttrBase)
205 pci = OOP_NewObject(NULL, CLID_Hidd_PCI, NULL);
207 D(bug("[VESA] Creating PCI object\n"));
209 if (pci)
211 struct Hook FindHook = {
212 h_Entry: (IPTR (*)())Enumerator,
213 h_Data: sd,
216 struct TagItem Requirements[] = {
217 { tHidd_PCI_Interface, 0x00 },
218 { tHidd_PCI_Class, 0x03 },
219 { tHidd_PCI_SubClass, 0x00 },
220 { TAG_DONE, 0UL }
223 struct pHidd_PCI_EnumDevices enummsg = {
224 mID: OOP_GetMethodID(IID_Hidd_PCI, moHidd_PCI_EnumDevices),
225 callback: &FindHook,
226 requirements: (struct TagItem*)&Requirements,
227 }, *msg = &enummsg;
228 D(bug("[VESA] Calling search Hook\n"));
229 OOP_DoMethod(pci, (OOP_Msg)msg);
230 OOP_DisposeObject(pci);
236 ** DACLoad --
237 ** load a palette
239 void DACLoad(struct HWData *restore, unsigned char first, int num)
241 int i, n;
243 n = first * 3;
244 outb(first, 0x3C8);
245 for (i=0; i<num*3; i++)
247 outb(restore->DAC[n++], 0x3C9);