[BOOTVID]: Fix completely broken VidInitialize routine. I have no idea what the origi...
authorSir Richard <sir_richard@svn.reactos.org>
Tue, 26 Jan 2010 19:21:41 +0000 (19:21 +0000)
committerSir Richard <sir_richard@svn.reactos.org>
Tue, 26 Jan 2010 19:21:41 +0000 (19:21 +0000)
svn path=/trunk/; revision=45269

reactos/drivers/base/bootvid/i386/bootvid.c

index 8cf2ba1..46770e2 100644 (file)
@@ -357,7 +357,7 @@ VidInitialize(IN BOOLEAN SetMode)
 {
     ULONG Context = 0;
     PHYSICAL_ADDRESS TranslatedAddress;
-    PHYSICAL_ADDRESS NullAddress = {{0, 0}};
+    PHYSICAL_ADDRESS NullAddress = {{0, 0}}, VgaAddress;
     ULONG AddressSpace = 1;
     BOOLEAN Result;
     ULONG_PTR Base;
@@ -373,12 +373,57 @@ VidInitialize(IN BOOLEAN SetMode)
                                           TRUE);
     if (!Result) return FALSE;
 
-    /* See if this is I/O Space, which we need to map */
-TryAgain:
+    /* Loop trying to find posssible VGA base addresses */
+    while (TRUE)
+    {
+        /* See if this is I/O Space, which we need to map */
+        if (!AddressSpace)
+        {
+            /* Map it */
+            Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress, 0x400, MmNonCached);
+        }
+        else
+        {
+            /* The base is the translated address, no need to map I/O space */
+            Base = TranslatedAddress.LowPart;
+        }
+
+        /* Try to see if this is VGA */
+        VgaRegisterBase = Base;
+        if (VgaIsPresent())
+        {
+            /* Translate the VGA Memory Address */
+            VgaAddress.LowPart = 0xA0000;
+            AddressSpace = 0;
+            Result = HalFindBusAddressTranslation(VgaAddress,
+                                                  &AddressSpace,
+                                                  &TranslatedAddress,
+                                                  &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);
+        }
+    }
+
+    /* Success! See if this is I/O Space, which we need to map */
     if (!AddressSpace)
     {
         /* Map it */
-        Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress, 0x400, MmNonCached);
+        Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress,
+                                       0x20000,
+                                       MmNonCached);
     }
     else
     {
@@ -386,67 +431,23 @@ TryAgain:
         Base = TranslatedAddress.LowPart;
     }
 
-    /* Set the VGA Register base and now check if we have a VGA device */
-    VgaRegisterBase = Base;
-    if (VgaIsPresent())
-    {
-        /* Translate the VGA Memory Address */
-        NullAddress.LowPart = 0xA0000;
-        AddressSpace = 0;
-        Result = HalFindBusAddressTranslation(NullAddress,
-                                              &AddressSpace,
-                                              &TranslatedAddress,
-                                              &Context,
-                                              FALSE);
-        if (Result)
-        {
-            /* Success! See if this is I/O Space, which we need to map */
-            if (!AddressSpace)
-            {
-                /* Map it */
-                Base = (ULONG_PTR)MmMapIoSpace(TranslatedAddress,
-                                               0x20000,
-                                               MmNonCached);
-            }
-            else
-            {
-                /* The base is the translated address, no need to map I/O space */
-                Base = TranslatedAddress.LowPart;
-            }
-
-            /* Set the VGA Memory Base */
-            VgaBase = Base;
+    /* Set the VGA Memory Base */
+    VgaBase = Base;
 
-            /* Now check if we have to set the mode */
-            if (SetMode)
-            {
-                /* Reset the display */
-                HalResetDisplay();
-                curr_x = 0;
-                curr_y = 0;
-
-                /* Initialize it */
-                VgaInterpretCmdStream(AT_Initialization);
-                return TRUE;
-            }
-        }
-    }
-    else
+    /* Now check if we have to set the mode */
+    if (SetMode)
     {
-        /* It's not, so unmap the I/O space if we mapped it */
-        if (!AddressSpace) MmUnmapIoSpace((PVOID)VgaRegisterBase, 0x400);
-    }
+        /* Reset the display */
+        HalResetDisplay();
+        curr_x = 0;
+        curr_y = 0;
 
-    /* If we got here, then we failed...let's try again */
-    Result = HalFindBusAddressTranslation(NullAddress,
-                                          &AddressSpace,
-                                          &TranslatedAddress,
-                                          &Context,
-                                          TRUE);
-    if (Result) goto TryAgain;
-
-    /* If we got here, then we failed even past our re-try... */
-    return FALSE;
+        /* Initialize it */
+        VgaInterpretCmdStream(AT_Initialization);
+    }
+    
+    /* VGA is ready */
+    return TRUE;
 }
 
 /*