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.


Added ATA PIO write, other ide cleanup
[palacios.git] / palacios / src / devices / ata.h
index 423679e..0f9c8df 100644 (file)
@@ -17,6 +17,9 @@
  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
  */
 
+#ifndef _DEVICES_ATA_H_
+#define _DEVICES_ATA_H_
+
 #define MAX_MULT_SECTORS  255
 
 
@@ -114,31 +117,29 @@ static int ata_read(struct ide_internal * ide, struct ide_channel * channel, uin
        drive->hd_state.accessed = 1;
     }
 
-    PrintDebug("Reading Drive LBA=%d (count=%d)\n", (uint32_t)(drive->current_lba), sect_cnt);
+    PrintDebug(VM_NONE, VCORE_NONE,"Reading Drive LBA=%d (count=%d)\n", (uint32_t)(drive->current_lba), sect_cnt);
 
     int ret = drive->ops->read(dst, drive->current_lba * HD_SECTOR_SIZE, sect_cnt * HD_SECTOR_SIZE, drive->private_data);
     
     if (ret == -1) {
-       PrintError("IDE: Error reading HD block (LBA=%p)\n", (void *)(addr_t)(drive->current_lba));
+       PrintError(VM_NONE, VCORE_NONE,"IDE: Error reading HD block (LBA=%p)\n", (void *)(addr_t)(drive->current_lba));
        return -1;
     }
 
     return 0;
-
-
-
 }
 
 
+
 static int ata_write(struct ide_internal * ide, struct ide_channel * channel, uint8_t * src, uint_t sect_cnt) {
     struct ide_drive * drive = get_selected_drive(channel);
 
-    PrintDebug("Writing Drive LBA=%d (count=%d)\n", (uint32_t)(drive->current_lba), sect_cnt);
+    PrintDebug(VM_NONE, VCORE_NONE,"Writing Drive LBA=%d (count=%d)\n", (uint32_t)(drive->current_lba), sect_cnt);
 
     int ret = drive->ops->write(src, drive->current_lba * HD_SECTOR_SIZE, sect_cnt * HD_SECTOR_SIZE, drive->private_data);
 
     if (ret == -1) {
-       PrintError("IDE: Error writing HD block (LBA=%p)\n", (void *)(addr_t)(drive->current_lba));
+       PrintError(VM_NONE, VCORE_NONE,"IDE: Error writing HD block (LBA=%p)\n", (void *)(addr_t)(drive->current_lba));
        return -1;
     }
 
@@ -172,7 +173,7 @@ static int ata_get_lba(struct ide_internal * ide, struct ide_channel * channel,
 
     if ((lba_addr.addr + sect_cnt) > 
        drive->ops->get_capacity(drive->private_data) / HD_SECTOR_SIZE) {
-       PrintError("IDE: request size exceeds disk capacity (lba=%d) (sect_cnt=%d) (ReadEnd=%d) (capacity=%p)\n", 
+       PrintError(VM_NONE, VCORE_NONE,"IDE: request size exceeds disk capacity (lba=%d) (sect_cnt=%d) (ReadEnd=%d) (capacity=%p)\n", 
                   lba_addr.addr, sect_cnt, 
                   lba_addr.addr + (sect_cnt * HD_SECTOR_SIZE),
                   (void *)(addr_t)(drive->ops->get_capacity(drive->private_data)));
@@ -185,6 +186,34 @@ static int ata_get_lba(struct ide_internal * ide, struct ide_channel * channel,
 
 
 // 28 bit LBA
+static int ata_write_sectors(struct ide_internal * ide,  struct ide_channel * channel) {
+    struct ide_drive * drive = get_selected_drive(channel);
+    uint32_t sect_cnt = (drive->sector_count == 0) ? 256 : drive->sector_count;
+
+    if (ata_get_lba(ide, channel, &(drive->current_lba)) == -1) {
+        ide_abort_command(ide, channel);
+        return 0;
+    }
+
+    drive->transfer_length = sect_cnt * HD_SECTOR_SIZE;
+    drive->transfer_index = 0;
+    channel->status.busy = 0;
+    channel->status.ready = 0;
+    channel->status.write_fault = 0;
+    channel->status.data_req = 1;
+    channel->status.error = 0;
+
+    drive->irq_flags.io_dir = 1;
+    drive->irq_flags.c_d = 0;
+    drive->irq_flags.rel = 0;
+
+    PrintDebug(VM_NONE, VCORE_NONE, "IDE: Returning from write sectors\n");
+
+    return 0;
+}
+
+
+// 28 bit LBA
 static int ata_read_sectors(struct ide_internal * ide,  struct ide_channel * channel) {
     struct ide_drive * drive = get_selected_drive(channel);
     // The if the sector count == 0 then read 256 sectors (cast up to handle that value)
@@ -197,7 +226,7 @@ static int ata_read_sectors(struct ide_internal * ide,  struct ide_channel * cha
 
     
     if (ata_read(ide, channel, drive->data_buf, 1) == -1) {
-       PrintError("Could not read disk sector\n");
+       PrintError(VM_NONE, VCORE_NONE,"Could not read disk sector\n");
        return -1;
     }
 
@@ -217,7 +246,7 @@ static int ata_read_sectors(struct ide_internal * ide,  struct ide_channel * cha
 
     ide_raise_irq(ide, channel);
 
-    PrintDebug("Returning from read sectors\n");
+    PrintDebug(VM_NONE, VCORE_NONE,"Returning from read sectors\n");
 
     return 0;
 }
@@ -229,7 +258,9 @@ static int ata_read_sectors_ext(struct ide_internal * ide, struct ide_channel *
     // The if the sector count == 0 then read 256 sectors (cast up to handle that value)
     //uint32_t sector_count = (drive->sector_count == 0) ? 256 : drive->sector_count;
 
-    PrintError("Extended Sector read not implemented\n");
+    PrintError(VM_NONE, VCORE_NONE, "Extended Sector read not implemented\n");
 
     return -1;
 }
+
+#endif