Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


updated the pci and IDE configuration.
[palacios.git] / palacios / src / devices / ata.h
index b759f0b..e31377a 100644 (file)
@@ -17,6 +17,8 @@
  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
  */
 
+#define MAX_MULT_SECTORS  255
+
 
 static void ata_identify_device(struct ide_drive * drive) {
     struct ide_drive_id * drive_id = (struct ide_drive_id *)(drive->data_buf);
@@ -54,6 +56,7 @@ static void ata_identify_device(struct ide_drive * drive) {
     // 32 bits access
     drive_id->dword_io = 1;
 
+
     // enable DMA access
     drive_id->dma_enable = 1;
 
@@ -66,14 +69,21 @@ static void ata_identify_device(struct ide_drive * drive) {
     // Drive Capacity (48 bit LBA)
     drive_id->lba_capacity_2 = drive->hd_ops->get_capacity(drive->private_data);
 
-    drive_id->rw_multiples = 0x80ff;
+
+    // lower byte is the maximum multiple sector size...
+    drive_id->rw_multiples = 0x8000 | MAX_MULT_SECTORS;
+
+
 
     // words 64-70, 54-58 valid
     drive_id->field_valid = 0x0007; // DMA + pkg cmd valid
 
+
     // copied from CFA540A
-    drive_id->buf[63] = 0x0103; // variable (DMA stuff)
+    // drive_id->buf[63] = 0x0103; // variable (DMA stuff)
     //drive_id->buf[63] = 0x0000; // variable (DMA stuff)
+    drive_id->buf[63] = 0x0007;
+
     
     //    drive_id->buf[64] = 0x0001; // PIO
     drive_id->buf[65] = 0x00b4;
@@ -87,14 +97,16 @@ static void ata_identify_device(struct ide_drive * drive) {
     //    drive_id->buf[80] = 0x1e; // supports up to ATA/ATAPI-4
     drive_id->major_rev_num = 0x0040; // supports up to ATA/ATAPI-6
 
+
     drive_id->buf[83] |= 0x0400; // supports 48 bit LBA
 
 
     drive_id->dma_ultra = 0x2020; // Ultra_DMA_Mode_5_Selected | Ultra_DMA_Mode_5_Supported;
+
 }
 
 
-static int ata_read(struct vm_device * dev, struct ide_channel * channel) {
+static int ata_read(struct vm_device * dev, struct ide_channel * channel, uint8_t * dst, uint_t sect_cnt) {
     struct ide_drive * drive = get_selected_drive(channel);
 
     if (drive->hd_state.accessed == 0) {
@@ -102,7 +114,7 @@ static int ata_read(struct vm_device * dev, struct ide_channel * channel) {
        drive->hd_state.accessed = 1;
     }
 
-    int ret = drive->hd_ops->read(drive->data_buf, 1, drive->current_lba, drive->private_data);
+    int ret = drive->hd_ops->read(dst, sect_cnt, drive->current_lba, drive->private_data);
     
     if (ret == -1) {
        PrintError("IDE: Error reading HD block (LBA=%p)\n", (void *)(addr_t)(drive->current_lba));
@@ -137,9 +149,6 @@ static int ata_read_sectors(struct vm_device * dev, struct ide_channel * channel
     lba_addr.buf[2] = drive->lba2;
     lba_addr.buf[3] = channel->drive_head.lba3;
 
-    PrintDebug("LBA Address %d\n", drive->lba0);
-    PrintDebug("sector_num %d\n", drive->sector_num);
-
 
     if (lba_addr.addr + (sect_cnt * IDE_SECTOR_SIZE) > 
        drive->hd_ops->get_capacity(drive->private_data)) {
@@ -153,7 +162,7 @@ static int ata_read_sectors(struct vm_device * dev, struct ide_channel * channel
 
     drive->current_lba = lba_addr.addr;
     
-    if (ata_read(dev, channel) == -1) {
+    if (ata_read(dev, channel, drive->data_buf, 1) == -1) {
        PrintError("Could not read disk sector\n");
        return -1;
     }