From 01d8e90c60599fedf29ebbb8a478ac18f64f4e74 Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Tue, 6 Aug 2013 14:48:39 +0100 Subject: rombios/ata Remove another needless trap from the int 0x13 hotpath The return value from await_ide() is always ignored, and most calls to await_ide() immediately reread the status register. Therefore, making await_ide() return the last value of the status register removes a further two traps on the int 0x13 path. Signed-off-by: Andrew Cooper Acked-by: Keir Fraser --- tools/firmware/rombios/rombios.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) (limited to 'tools/firmware') diff --git a/tools/firmware/rombios/rombios.c b/tools/firmware/rombios/rombios.c index f5557477a5..057aced347 100644 --- a/tools/firmware/rombios/rombios.c +++ b/tools/firmware/rombios/rombios.c @@ -2531,14 +2531,14 @@ void ata_init( ) #define IDE_TIMEOUT 32000u //32 seconds max for IDE ops -int await_ide(); -static int await_ide(when_done,base,timeout) +Bit8u await_ide(); +static Bit8u await_ide(when_done,base,timeout) Bit8u when_done; Bit16u base; Bit16u timeout; { Bit32u time=0,last=0; - Bit16u status; + Bit8u status; Bit8u result; for(;;) { status = inb(base+ATA_CB_STAT); @@ -2556,7 +2556,7 @@ static int await_ide(when_done,base,timeout) else if (when_done == TIMEOUT) result = 0; - if (result) return 0; + if (result) return status; if (time>>16 != last) // mod 2048 each 16 ms { last = time >>16; @@ -2565,12 +2565,12 @@ static int await_ide(when_done,base,timeout) if (status & ATA_CB_STAT_ERR) { BX_DEBUG_ATA("await_ide: ERROR (TIMEOUT,BSY,!BSY,!BSY_DRQ,!BSY_!DRQ,!BSY_RDY) %d time= %ld timeout= %d\n",when_done,time>>11, timeout); - return -1; + return status; } if ((timeout == 0) || ((time>>11) > timeout)) break; } BX_INFO("IDE time out\n"); - return -1; + return status; } // --------------------------------------------------------------------------- @@ -3016,8 +3016,7 @@ Bit32u lba_low, lba_high; outb(iobase1 + ATA_CB_DH, (slave ? ATA_CB_DH_DEV1 : ATA_CB_DH_DEV0) | (Bit8u) head ); outb(iobase1 + ATA_CB_CMD, command); - await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT); - status = inb(iobase1 + ATA_CB_STAT); + status = await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT); if (status & ATA_CB_STAT_ERR) { BX_DEBUG_ATA("ata_cmd_data_in : read error\n"); @@ -3077,8 +3076,7 @@ ASM_END current++; write_word(ebda_seg, &EbdaData->ata.trsfsectors,current); count--; - await_ide(NOT_BSY, iobase1, IDE_TIMEOUT); - status = inb(iobase1 + ATA_CB_STAT); + status = await_ide(NOT_BSY, iobase1, IDE_TIMEOUT); if (count == 0) { if ( (status & (ATA_CB_STAT_BSY | ATA_CB_STAT_RDY | ATA_CB_STAT_DRQ | ATA_CB_STAT_ERR) ) != ATA_CB_STAT_RDY ) { @@ -3167,8 +3165,7 @@ Bit32u lba_low, lba_high; outb(iobase1 + ATA_CB_DH, (slave ? ATA_CB_DH_DEV1 : ATA_CB_DH_DEV0) | (Bit8u) head ); outb(iobase1 + ATA_CB_CMD, command); - await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT); - status = inb(iobase1 + ATA_CB_STAT); + status = await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT); if (status & ATA_CB_STAT_ERR) { BX_DEBUG_ATA("ata_cmd_data_out : read error\n"); @@ -3316,8 +3313,7 @@ Bit32u length; outb(iobase1 + ATA_CB_CMD, ATA_CMD_PACKET); // Device should ok to receive command - await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT); - status = inb(iobase1 + ATA_CB_STAT); + status = await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT); if (status & ATA_CB_STAT_ERR) { BX_DEBUG_ATA("ata_cmd_packet : error, status is %02x\n",status); @@ -3353,8 +3349,7 @@ ASM_START ASM_END if (inout == ATA_DATA_NO) { - await_ide(NOT_BSY, iobase1, IDE_TIMEOUT); - status = inb(iobase1 + ATA_CB_STAT); + status = await_ide(NOT_BSY, iobase1, IDE_TIMEOUT); } else { Bit16u loops = 0; @@ -3363,13 +3358,12 @@ ASM_END if (loops == 0) {//first time through status = inb(iobase2 + ATA_CB_ASTAT); - await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT); + status = await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT); } else - await_ide(NOT_BSY, iobase1, IDE_TIMEOUT); + status = await_ide(NOT_BSY, iobase1, IDE_TIMEOUT); loops++; - status = inb(iobase1 + ATA_CB_STAT); sc = inb(iobase1 + ATA_CB_SC); // Check if command completed -- cgit v1.2.3