All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.