Add IDE ATA read using PIO/DMA
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user