diff options
author | Myles Watson <mylesgw@gmail.com> | 2010-09-07 23:27:59 +0000 |
---|---|---|
committer | Myles Watson <mylesgw@gmail.com> | 2010-09-07 23:27:59 +0000 |
commit | fe09fd1dacd76badd7a2adf8c8933d927f4bce93 (patch) | |
tree | a616bf5ecd0db4c80191392405b7996ea1771022 /src/devices/oprom | |
parent | 6c9bc01b0ead45ebde3479e2c3c0c150ce99625f (diff) |
My Jmicron SATA card depends on the BIOS not clearing AL when setting AH.
Signed-off-by: Myles Watson <mylesgw@gmail.com>
Acked-by: Myles Watson <mylesgw@gmail.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5784 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src/devices/oprom')
-rw-r--r-- | src/devices/oprom/x86_interrupts.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/devices/oprom/x86_interrupts.c b/src/devices/oprom/x86_interrupts.c index 44c98d130c..1dd645b421 100644 --- a/src/devices/oprom/x86_interrupts.c +++ b/src/devices/oprom/x86_interrupts.c @@ -99,7 +99,8 @@ int int1a_handler(struct eregs *regs) } 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 @@ int int1a_handler(struct eregs *regs) 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 @@ int int1a_handler(struct eregs *regs) 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 @@ int int1a_handler(struct eregs *regs) 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; } |