Add IDE ATA read using PIO/DMA

This commit is contained in:
Mark
2019-10-22 01:09:22 +03:00
parent 9acc2c6064
commit 1af3d0dd78
6 changed files with 236 additions and 5 deletions
+3
View File
@@ -22,6 +22,9 @@
#define ATA_CMD_IDENTIFY 0xEC
#define ATA_CMD_IDENTIFY_PACKET 0xA1
#define ATA_CMD_READ_PIO 0x20
#define ATA_CMD_READ_PIO_EX 0x24
#define ATA_CMD_READ_DMA 0xC8
#define ATA_CMD_READ_DMA_EX 0x25
#define ATA_SR_BUSY (1 << 7)
+12
View File
@@ -6,6 +6,12 @@
#define IDE_DEFAULT_BAR2 0x170
#define IDE_DEFAULT_BAR3 0x376
struct ide_prdt_entry {
uint32_t addr;
uint16_t size;
uint16_t attr;
} __attribute__((packed));
struct ide_controller {
uint16_t bar0; // Primary channel
uint16_t bar1; // Primary control port
@@ -14,6 +20,8 @@ struct ide_controller {
uint16_t bar4; // Bus master control
uint8_t irq0, irq1;
uintptr_t dma_page;
struct ide_channel {
uint16_t base;
uint16_t ctrl;
@@ -28,6 +36,7 @@ struct ide_controller {
// 2 1 if slave device
// 3 1 if device is ATAPI (ATA otherwise)
// ...
struct ide_controller *ide;
uint8_t attr;
uint16_t signature;
uint16_t caps;
@@ -37,4 +46,7 @@ struct ide_controller {
} devices[4];
};
int ide_ata_read_pio(struct ide_device *dev, void *buf, size_t nsect, uint64_t lba);
int ide_ata_read_dma(struct ide_device *dev, void *buf, size_t nsect, uint64_t lba);
void ide_init(struct ide_controller *ide);
+2
View File
@@ -5,6 +5,8 @@
#pragma once
#include "sys/types.h"
#define MIN(x, y) ((x) < (y) ? (x) : (y))
void *memcpy(void *restrict dst, const void *restrict src, size_t cnt);
void *memmove(void *dst, const void *src, size_t cnt);
void *memset(void *dst, int v, size_t count);