summaryrefslogtreecommitdiff
path: root/src/kernel/arch/amd64/ata.c
diff options
context:
space:
mode:
authordzwdz2022-08-14 21:18:01 +0200
committerdzwdz2022-08-14 21:18:01 +0200
commitfa082df2da6b3be52c66ce0d48c209a3df38115d (patch)
tree1c51b4d084d966fddfbc91afb33469e4582cde84 /src/kernel/arch/amd64/ata.c
parentb58a95e1a529db1f640eb9ac3ca6e0244790e0ca (diff)
kernel/ata: "proper" read support
Diffstat (limited to 'src/kernel/arch/amd64/ata.c')
-rw-r--r--src/kernel/arch/amd64/ata.c10
1 files changed, 6 insertions, 4 deletions
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();