aboutsummaryrefslogtreecommitdiff
path: root/mirai.old/drivers/ahci/fis.zig
diff options
context:
space:
mode:
Diffstat (limited to 'mirai.old/drivers/ahci/fis.zig')
-rw-r--r--mirai.old/drivers/ahci/fis.zig40
1 files changed, 40 insertions, 0 deletions
diff --git a/mirai.old/drivers/ahci/fis.zig b/mirai.old/drivers/ahci/fis.zig
new file mode 100644
index 0000000..d182493
--- /dev/null
+++ b/mirai.old/drivers/ahci/fis.zig
@@ -0,0 +1,40 @@
+//! AHCI FIS utilities
+
+const ahci_const = @import("../../common/constants/ahci.zig");
+const ata = @import("../../common/constants/ata.zig");
+const int = @import("../../utils/types/int.zig");
+const types = @import("types.zig");
+
+pub fn setup_read(fis: *volatile types.FISRegH2D, lba: u64) void {
+ fis.fis_type = ahci_const.FIS_TYPE_REG_H2D;
+ fis.pmport_c = 0x80;
+ fis.command = ata.CMD_READ_DMA_EX;
+
+ fis.lba0 = int.u8_of(lba);
+ fis.lba1 = int.u8_of(lba >> 8);
+ fis.lba2 = int.u8_of(lba >> 16);
+ fis.device = 1 << 6;
+ fis.lba3 = int.u8_of(lba >> 24);
+ fis.lba4 = int.u8_of(lba >> 32);
+ fis.lba5 = int.u8_of(lba >> 40);
+
+ fis.countl = 1;
+ fis.counth = 0;
+}
+
+pub fn setup_write(fis: *volatile types.FISRegH2D, lba: u64) void {
+ fis.fis_type = ahci_const.FIS_TYPE_REG_H2D;
+ fis.pmport_c = 0x80;
+ fis.command = ata.CMD_WRITE_DMA_EX;
+
+ fis.lba0 = int.u8_of(lba);
+ fis.lba1 = int.u8_of(lba >> 8);
+ fis.lba2 = int.u8_of(lba >> 16);
+ fis.device = 1 << 6;
+ fis.lba3 = int.u8_of(lba >> 24);
+ fis.lba4 = int.u8_of(lba >> 32);
+ fis.lba5 = int.u8_of(lba >> 40);
+
+ fis.countl = 1;
+ fis.counth = 0;
+}