Skip to content

Commit 06cbc2a

Browse files
diseanbinarymaster
authored andcommitted
[BOOTVID] More improvements for PC-98 (reactos#2936)
- Fix failure handling - Reduce memory mapping that's not needed
1 parent e318801 commit 06cbc2a

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

drivers/base/bootvid/i386/pc98/bootvid.c

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
/* GLOBALS ********************************************************************/
1313

14-
static ULONG_PTR VideoMemoryI;
15-
ULONG_PTR FrameBuffer;
14+
static ULONG_PTR PegcControl = 0;
15+
ULONG_PTR FrameBuffer = 0;
1616

1717
#define PEGC_MAX_COLORS 256
1818

@@ -25,23 +25,38 @@ GraphGetStatus(
2525
UCHAR Result;
2626

2727
WRITE_PORT_UCHAR((PUCHAR)GRAPH_IO_o_STATUS_SELECT, Status);
28-
KeStallExecutionProcessor(1);
2928
Result = READ_PORT_UCHAR((PUCHAR)GRAPH_IO_i_STATUS);
3029

3130
return (Result & GRAPH_STATUS_SET) && (Result != 0xFF);
3231
}
3332

33+
static BOOLEAN
34+
TestMmio(VOID)
35+
{
36+
USHORT OldValue, NewValue;
37+
38+
OldValue = READ_REGISTER_USHORT((PUSHORT)(PegcControl + PEGC_MMIO_MODE));
39+
40+
/* Bits [15:1] are not writable */
41+
WRITE_REGISTER_USHORT((PUSHORT)(PegcControl + PEGC_MMIO_MODE), 0x80);
42+
NewValue = READ_REGISTER_USHORT((PUSHORT)(PegcControl + PEGC_MMIO_MODE));
43+
44+
WRITE_REGISTER_USHORT((PUSHORT)(PegcControl + PEGC_MMIO_MODE), OldValue);
45+
46+
return !(NewValue & 0x80);
47+
}
48+
3449
static BOOLEAN
3550
HasPegcController(VOID)
3651
{
3752
BOOLEAN Success;
3853

3954
if (GraphGetStatus(GRAPH_STATUS_PEGC))
40-
return TRUE;
55+
return TestMmio();
4156

4257
WRITE_PORT_UCHAR((PUCHAR)GDC2_IO_o_MODE_FLIPFLOP2, GDC2_EGC_FF_UNPROTECT);
4358
WRITE_PORT_UCHAR((PUCHAR)GDC2_IO_o_MODE_FLIPFLOP2, GDC2_MODE_PEGC_ENABLE);
44-
Success = GraphGetStatus(GRAPH_STATUS_PEGC);
59+
Success = GraphGetStatus(GRAPH_STATUS_PEGC) ? TestMmio() : FALSE;
4560
WRITE_PORT_UCHAR((PUCHAR)GDC2_IO_o_MODE_FLIPFLOP2, GDC2_MODE_PEGC_DISABLE);
4661
WRITE_PORT_UCHAR((PUCHAR)GDC2_IO_o_MODE_FLIPFLOP2, GDC2_EGC_FF_PROTECT);
4762

@@ -212,8 +227,8 @@ InitializeDisplay(VOID)
212227
WRITE_PORT_UCHAR((PUCHAR)GDC2_IO_o_MODE_FLIPFLOP2, GDC2_MODE_PEGC_ENABLE);
213228
WRITE_PORT_UCHAR((PUCHAR)GDC2_IO_o_MODE_FLIPFLOP2, GDC2_MODE_LINES_800);
214229
WRITE_PORT_UCHAR((PUCHAR)GDC2_IO_o_MODE_FLIPFLOP2, GDC2_EGC_FF_PROTECT);
215-
WRITE_REGISTER_USHORT((PUSHORT)(VideoMemoryI + PEGC_MMIO_MODE), PEGC_MODE_PACKED);
216-
WRITE_REGISTER_USHORT((PUSHORT)(VideoMemoryI + PEGC_MMIO_FRAMEBUFFER), PEGC_FB_MAP);
230+
WRITE_REGISTER_USHORT((PUSHORT)(PegcControl + PEGC_MMIO_MODE), PEGC_MODE_PACKED);
231+
WRITE_REGISTER_USHORT((PUSHORT)(PegcControl + PEGC_MMIO_FRAMEBUFFER), PEGC_FB_MAP);
217232

218233
/* Select the video source */
219234
RelayState = READ_PORT_UCHAR((PUCHAR)GRAPH_IO_i_RELAY) & ~(GRAPH_RELAY_0 | GRAPH_RELAY_1);
@@ -348,8 +363,8 @@ VidInitialize(
348363
PHYSICAL_ADDRESS BaseAddress;
349364

350365
BaseAddress.QuadPart = VRAM_NORMAL_PLANE_I;
351-
VideoMemoryI = (ULONG_PTR)MmMapIoSpace(BaseAddress, VRAM_PLANE_SIZE, MmNonCached);
352-
if (!VideoMemoryI)
366+
PegcControl = (ULONG_PTR)MmMapIoSpace(BaseAddress, PEGC_CONTROL_SIZE, MmNonCached);
367+
if (!PegcControl)
353368
goto Failure;
354369

355370
if (!HasPegcController())
@@ -366,8 +381,8 @@ VidInitialize(
366381
return TRUE;
367382

368383
Failure:
369-
if (!VideoMemoryI) MmUnmapIoSpace((PVOID)VideoMemoryI, VRAM_PLANE_SIZE);
370-
if (!FrameBuffer) MmUnmapIoSpace((PVOID)FrameBuffer, PEGC_FRAMEBUFFER_SIZE);
384+
if (PegcControl)
385+
MmUnmapIoSpace((PVOID)PegcControl, PEGC_CONTROL_SIZE);
371386

372387
return FALSE;
373388
}

sdk/include/reactos/drivers/pc98/video.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#define PEGC_FRAMEBUFFER_PACKED 0xF00000
2323
#define PEGC_FRAMEBUFFER_SIZE 0x080000
2424

25+
#define PEGC_CONTROL_SIZE 0x000200
26+
2527
/* High-resolution machine */
2628
#define VRAM_HI_RESO_PLANE_B 0xC0000
2729
#define VRAM_HI_RESO_PLANE_G 0xC8000

0 commit comments

Comments
 (0)