2 Copyright © 1995-2002, The AROS Development Team. All rights reserved.
5 Desc: vesa "hardware" functions
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>
16 #include <proto/bootloader.h>
17 #include <proto/oop.h>
18 #include <utility/hooks.h>
19 #include <utility/tagitem.h>
24 #include "vesagfxclass.h"
30 extern struct ExecBase
*SysBase
;
31 OOP_AttrBase HiddPCIDeviceAttrBase
;
32 static void Find_PCI_Card(struct HWData
*sd
);
34 unsigned char cursorPalette
[] =
41 BOOL
initVesaGfxHW(struct HWData
*data
)
43 struct BootLoaderBase
*BootLoaderBase
;
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"));
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
)
72 if (!data
->framebuffer
) {
73 D(bug("[Vesa] HwInit: Framebuffer not found\n"));
79 data
->bytesperpixel
= 4;
81 else if (data
->depth
> 16)
83 data
->bytesperpixel
= 3;
85 else if (data
->depth
> 8)
87 data
->bytesperpixel
= 2;
91 data
->bytesperpixel
= 1;
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
));
114 bug("[Vesa] HwInit: No Vesa information from the bootloader. Failing\n");
120 void vesaRefreshArea(struct BitmapData
*data
, LONG x1
, LONG y1
, LONG x2
, LONG y2
)
123 ULONG srcmod
, dstmod
;
126 x1
*= data
->bytesperpix
;
127 x2
*= data
->bytesperpix
; x2
+= data
->bytesperpix
- 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
);
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
))
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
));
197 static void Find_PCI_Card(struct HWData
*sd
)
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"));
211 struct Hook FindHook
= {
212 h_Entry
: (IPTR (*)())Enumerator
,
216 struct TagItem Requirements
[] = {
217 { tHidd_PCI_Interface
, 0x00 },
218 { tHidd_PCI_Class
, 0x03 },
219 { tHidd_PCI_SubClass
, 0x00 },
223 struct pHidd_PCI_EnumDevices enummsg
= {
224 mID
: OOP_GetMethodID(IID_Hidd_PCI
, moHidd_PCI_EnumDevices
),
226 requirements
: (struct TagItem
*)&Requirements
,
228 D(bug("[VESA] Calling search Hook\n"));
229 OOP_DoMethod(pci
, (OOP_Msg
)msg
);
230 OOP_DisposeObject(pci
);
239 void DACLoad(struct HWData
*restore
, unsigned char first
, int num
)
245 for (i
=0; i
<num
*3; i
++)
247 outb(restore
->DAC
[n
++], 0x3C9);