From fa082df2da6b3be52c66ce0d48c209a3df38115d Mon Sep 17 00:00:00 2001 From: dzwdz Date: Sun, 14 Aug 2022 21:18:01 +0200 Subject: kernel/ata: "proper" read support --- src/kernel/arch/amd64/ata.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src/kernel/arch/amd64/ata.c') diff --git a/src/kernel/arch/amd64/ata.c b/src/kernel/arch/amd64/ata.c index 5c5fc57..d88f890 100644 --- a/src/kernel/arch/amd64/ata.c +++ b/src/kernel/arch/amd64/ata.c @@ -23,8 +23,6 @@ enum { CMD = 7, STATUS = 7, - /* note: the OSDev wiki uses a different base port for the control port - * however i can just use this offset and stuff will just work tm */ CTRL = 0x206, }; // offsets @@ -40,11 +38,11 @@ static void ata_400ns(void) { port_in8(base + STATUS); } -static void ata_driveselect(int drive, int block) { +static void ata_driveselect(int drive, int lba) { uint8_t v = 0xE0; if (drive&1) // slave? v |= 0x10; // set drive number bit - // TODO account for block + v |= (lba >> 24) & 0xf; port_out8(ata_iobase(drive) + DRV, v); } @@ -124,6 +122,10 @@ bool ata_available(int drive) { return ata_drives[drive].type != DEV_UNKNOWN; } +size_t ata_size(int drive) { + return ata_drives[drive].sectors * ATA_SECTOR; +} + int ata_read(int drive, uint32_t lba, void *buf) { if (ata_drives[drive].type != DEV_PATA) panic_unimplemented(); -- cgit v1.2.3