Author: myles
Date: Wed Sep  8 01:27:59 2010
New Revision: 5784
URL: https://tracker.coreboot.org/trac/coreboot/changeset/5784

Log:
My Jmicron SATA card depends on the BIOS not clearing AL when setting AH.

Signed-off-by: Myles Watson <[email protected]>
Acked-by: Myles Watson <[email protected]>

Modified:
   trunk/src/devices/oprom/x86_interrupts.c

Modified: trunk/src/devices/oprom/x86_interrupts.c
==============================================================================
--- trunk/src/devices/oprom/x86_interrupts.c    Wed Sep  8 00:30:15 2010        
(r5783)
+++ trunk/src/devices/oprom/x86_interrupts.c    Wed Sep  8 01:27:59 2010        
(r5784)
@@ -99,7 +99,8 @@
                }
                if (dev) {
                        unsigned short busdevfn;
-                       regs->eax = 0;
+                       regs->eax &= 0xffff00ff; /* Clear AH */
+                       regs->eax |= PCIBIOS_SUCCESSFUL;
                        // busnum is an unsigned char;
                        // devfn is an int, so we mask it off.
                        busdevfn = (dev->bus->secondary << 8)
@@ -108,7 +109,8 @@
                        regs->ebx = busdevfn;
                        retval = 0;
                } else {
-                       regs->eax = PCIBIOS_NODEV;
+                       regs->eax &= 0xffff00ff; /* Clear AH */
+                       regs->eax |= PCIBIOS_NODEV;
                        retval = -1;
                }
                break;
@@ -125,7 +127,8 @@
                if (!dev) {
                        printk(BIOS_DEBUG, "0x%x: BAD DEVICE bus %d devfn 
0x%x\n", func, bus, devfn);
                        // Or are we supposed to return PCIBIOS_NODEV?
-                       regs->eax = PCIBIOS_BADREG;
+                       regs->eax &= 0xffff00ff; /* Clear AH */
+                       regs->eax |= PCIBIOS_BADREG;
                        retval = -1;
                        return retval;
                }
@@ -160,11 +163,14 @@
                printk(BIOS_DEBUG, "0x%x: bus %d devfn 0x%x reg 0x%x val 
0x%x\n",
                             func, bus, devfn, reg, regs->ecx);
 #endif
-               regs->eax = 0;
+               regs->eax &= 0xffff00ff; /* Clear AH */
+               regs->eax |= PCIBIOS_SUCCESSFUL;
                retval = 0;
                break;
        default:
                printk(BIOS_ERR, "UNSUPPORTED PCIBIOS FUNCTION 0x%x\n", func);
+               regs->eax &= 0xffff00ff; /* Clear AH */
+               regs->eax |= PCIBIOS_UNSUPPORTED;
                retval = -1;
                break;
        }

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to