diff options
Diffstat (limited to 'mirai.old/drivers/ahci/fis.zig')
| -rw-r--r-- | mirai.old/drivers/ahci/fis.zig | 40 |
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; +} |
