* [PATCH] LBA48 support in rombios
@ 2007-12-27 11:53 Samuel Thibault
0 siblings, 0 replies; only message in thread
From: Samuel Thibault @ 2007-12-27 11:53 UTC (permalink / raw)
To: xen-devel
INT13 LBA48 support for disks bigger than 128GB. The new limit should be
2TB.
Signed-off-by: Samuel Thibault <samuel.thibault@citrix.com>
diff -r d048ef27cb02 tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c Fri Nov 09 15:21:01 2007 +0000
+++ b/tools/firmware/rombios/rombios.c Mon Nov 12 14:26:16 2007 +0000
@@ -2538,7 +2538,10 @@
case ATA_TYPE_ATA:
printf("ata%d %s: ",channel,slave?" slave":"master");
i=0; while(c=read_byte(get_SS(),model+i++)) printf("%c",c);
- printf(" ATA-%d Hard-Disk (%d MBytes)\n",version,(Bit16u)sizeinmb);
+ if (sizeinmb < 1UL<<16)
+ printf(" ATA-%d Hard-Disk (%04u MBytes)\n",version,(Bit16u)sizeinmb);
+ else
+ printf(" ATA-%d Hard-Disk (%04u GBytes)\n",version,(Bit16u)(sizeinmb>>10));
break;
case ATA_TYPE_ATAPI:
printf("ata%d %s: ",channel,slave?" slave":"master");
@@ -2671,8 +2674,28 @@
if (mode == ATA_MODE_PIO32) blksize>>=2;
else blksize>>=1;
+ // Reset count of transferred data
+ write_word(ebda_seg, &EbdaData->ata.trsfsectors,0);
+ write_dword(ebda_seg, &EbdaData->ata.trsfbytes,0L);
+ current = 0;
+
+ status = inb(iobase1 + ATA_CB_STAT);
+ if (status & ATA_CB_STAT_BSY) return 1;
+
+ outb(iobase2 + ATA_CB_DC, ATA_CB_DC_HD15 | ATA_CB_DC_NIEN);
+
// sector will be 0 only on lba access. Convert to lba-chs
if (sector == 0) {
+ if ((count >= 1 << 8) || (lba + count >= 1UL << 28)) {
+ outb(iobase1 + ATA_CB_FR, 0x00);
+ outb(iobase1 + ATA_CB_SC, (count >> 8) & 0xff);
+ outb(iobase1 + ATA_CB_SN, lba >> 24);
+ outb(iobase1 + ATA_CB_CL, 0);
+ outb(iobase1 + ATA_CB_CH, 0);
+ command |= 0x04;
+ count &= (1UL << 8) - 1;
+ lba &= (1UL << 24) - 1;
+ }
sector = (Bit16u) (lba & 0x000000ffL);
lba >>= 8;
cylinder = (Bit16u) (lba & 0x0000ffffL);
@@ -2680,15 +2703,6 @@
head = ((Bit16u) (lba & 0x0000000fL)) | 0x40;
}
- // Reset count of transferred data
- write_word(ebda_seg, &EbdaData->ata.trsfsectors,0);
- write_dword(ebda_seg, &EbdaData->ata.trsfbytes,0L);
- current = 0;
-
- status = inb(iobase1 + ATA_CB_STAT);
- if (status & ATA_CB_STAT_BSY) return 1;
-
- outb(iobase2 + ATA_CB_DC, ATA_CB_DC_HD15 | ATA_CB_DC_NIEN);
outb(iobase1 + ATA_CB_FR, 0x00);
outb(iobase1 + ATA_CB_SC, count);
outb(iobase1 + ATA_CB_SN, sector);
@@ -2814,8 +2828,28 @@
if (mode == ATA_MODE_PIO32) blksize>>=2;
else blksize>>=1;
+ // Reset count of transferred data
+ write_word(ebda_seg, &EbdaData->ata.trsfsectors,0);
+ write_dword(ebda_seg, &EbdaData->ata.trsfbytes,0L);
+ current = 0;
+
+ status = inb(iobase1 + ATA_CB_STAT);
+ if (status & ATA_CB_STAT_BSY) return 1;
+
+ outb(iobase2 + ATA_CB_DC, ATA_CB_DC_HD15 | ATA_CB_DC_NIEN);
+
// sector will be 0 only on lba access. Convert to lba-chs
if (sector == 0) {
+ if ((count >= 1 << 8) || (lba + count >= 1UL << 28)) {
+ outb(iobase1 + ATA_CB_FR, 0x00);
+ outb(iobase1 + ATA_CB_SC, (count >> 8) & 0xff);
+ outb(iobase1 + ATA_CB_SN, lba >> 24);
+ outb(iobase1 + ATA_CB_CL, 0);
+ outb(iobase1 + ATA_CB_CH, 0);
+ command |= 0x04;
+ count &= (1UL << 8) - 1;
+ lba &= (1UL << 24) - 1;
+ }
sector = (Bit16u) (lba & 0x000000ffL);
lba >>= 8;
cylinder = (Bit16u) (lba & 0x0000ffffL);
@@ -2823,15 +2857,6 @@
head = ((Bit16u) (lba & 0x0000000fL)) | 0x40;
}
- // Reset count of transferred data
- write_word(ebda_seg, &EbdaData->ata.trsfsectors,0);
- write_dword(ebda_seg, &EbdaData->ata.trsfbytes,0L);
- current = 0;
-
- status = inb(iobase1 + ATA_CB_STAT);
- if (status & ATA_CB_STAT_BSY) return 1;
-
- outb(iobase2 + ATA_CB_DC, ATA_CB_DC_HD15 | ATA_CB_DC_NIEN);
outb(iobase1 + ATA_CB_FR, 0x00);
outb(iobase1 + ATA_CB_SC, count);
outb(iobase1 + ATA_CB_SN, sector);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-12-27 11:53 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-12-27 11:53 [PATCH] LBA48 support in rombios Samuel Thibault
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.