[BOOTVID] Fixes for VgaIsPresent() and VidInitialize().

- VgaIsPresent(): Re-select the memory mode register before playing
  around with the sequencer flag. Otherwise the VGA may not be detected
  correctly from time to time.

- VidInitialize(): Simplify the initialization loop, reset AddressSpace
  to its "default" value of 1 when calling HalFindBusAddressTranslation()
  on 'NullAddress'.
This commit is contained in:
Hermès Bélusca-Maïto 2019-06-23 03:03:40 +02:00
parent 025cfb108b
commit 8f04a09e74
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0

View file

@ -332,6 +332,9 @@ VgaIsPresent(VOID)
/* Write null plane */
__outpw(0x3C4, 0x100);
/* Select memory mode register */
__outpb(0x3C4, 4);
/* Write sequencer flag */
__outpb(0x3C5, SeqReg2 ^ 8);
@ -365,24 +368,25 @@ VidInitialize(IN BOOLEAN SetMode)
ULONG_PTR Context = 0;
PHYSICAL_ADDRESS TranslatedAddress;
PHYSICAL_ADDRESS NullAddress = {{0, 0}}, VgaAddress;
ULONG AddressSpace = 1;
ULONG AddressSpace;
BOOLEAN Result;
ULONG_PTR Base;
/* Make sure that we have a bus translation function */
if (!HalFindBusAddressTranslation) return FALSE;
/* Get the VGA Register address */
Result = HalFindBusAddressTranslation(NullAddress,
&AddressSpace,
&TranslatedAddress,
&Context,
TRUE);
if (!Result) return FALSE;
/* Loop trying to find possible VGA base addresses */
while (TRUE)
{
/* Get the VGA Register address */
AddressSpace = 1;
Result = HalFindBusAddressTranslation(NullAddress,
&AddressSpace,
&TranslatedAddress,
&Context,
TRUE);
if (!Result) return FALSE;
/* See if this is I/O Space, which we need to map */
if (!AddressSpace)
{
@ -409,20 +413,14 @@ VidInitialize(IN BOOLEAN SetMode)
&Context,
FALSE);
if (Result) break;
/* Try to see if there's any other address */
Result = HalFindBusAddressTranslation(NullAddress,
&AddressSpace,
&TranslatedAddress,
&Context,
TRUE);
if (!Result) return FALSE;
}
else
{
/* It's not, so unmap the I/O space if we mapped it */
if (!AddressSpace) MmUnmapIoSpace((PVOID)VgaRegisterBase, 0x400);
}
/* Continue trying to see if there's any other address */
}
/* Success! See if this is I/O Space, which we need to map */