131 lines
3.7 KiB
C
131 lines
3.7 KiB
C
// ata.h - PCI IDE / ATA driver internals.
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#include <intrin.h>
|
|
|
|
#include <ntlite/ddi/hal_api.h>
|
|
#include <ntlite/ddi/io_driver.h>
|
|
#include <ntlite/ddi/pci.h>
|
|
#include <ntlite/status.h>
|
|
#include <kernel/ke_debug.h>
|
|
#include <kernel/ke_irp.h>
|
|
#include <kernel/ke_sched.h>
|
|
#include <kernel/ke_semaphore.h>
|
|
#include <kernel/ke_thread.h>
|
|
#include <kernel/mm_phys.h>
|
|
#include <kernel/mm_virt.h>
|
|
|
|
#define ATA_CONTROLLER_MAGIC 0x41544143u // ATAC
|
|
#define ATA_DEVICE_MAGIC 0x41544144u // ATAD
|
|
|
|
#define ATA_MAX_CONTROLLERS 8u
|
|
#define ATA_CHANNEL_COUNT 2u
|
|
#define ATA_DRIVES_PER_CHANNEL 2u
|
|
#define ATA_MAX_DEVICES_PER_CTL (ATA_CHANNEL_COUNT * ATA_DRIVES_PER_CHANNEL)
|
|
|
|
#define ATA_PRIMARY_LEGACY_CMD_BASE 0x1F0u
|
|
#define ATA_PRIMARY_LEGACY_CTL_BASE 0x3F6u
|
|
#define ATA_PRIMARY_LEGACY_IRQ 14u
|
|
#define ATA_SECONDARY_LEGACY_CMD_BASE 0x170u
|
|
#define ATA_SECONDARY_LEGACY_CTL_BASE 0x376u
|
|
#define ATA_SECONDARY_LEGACY_IRQ 15u
|
|
|
|
#define ATA_REG_DATA 0x00u
|
|
#define ATA_REG_ERROR 0x01u
|
|
#define ATA_REG_FEATURES 0x01u
|
|
#define ATA_REG_SECTOR_COUNT 0x02u
|
|
#define ATA_REG_LBA0 0x03u
|
|
#define ATA_REG_LBA1 0x04u
|
|
#define ATA_REG_LBA2 0x05u
|
|
#define ATA_REG_DRIVE_HEAD 0x06u
|
|
#define ATA_REG_STATUS 0x07u
|
|
#define ATA_REG_COMMAND 0x07u
|
|
#define ATA_REG_ALT_STATUS 0x00u
|
|
#define ATA_REG_DEVICE_CONTROL 0x00u
|
|
|
|
#define ATA_STATUS_ERR 0x01u
|
|
#define ATA_STATUS_DRQ 0x08u
|
|
#define ATA_STATUS_DF 0x20u
|
|
#define ATA_STATUS_DRDY 0x40u
|
|
#define ATA_STATUS_BSY 0x80u
|
|
|
|
#define ATA_CMD_READ_SECTORS 0x20u
|
|
#define ATA_CMD_WRITE_SECTORS 0x30u
|
|
#define ATA_CMD_CACHE_FLUSH 0xE7u
|
|
#define ATA_CMD_IDENTIFY_DEVICE 0xECu
|
|
#define ATA_CMD_READ_SECTORS_EXT 0x24u
|
|
#define ATA_CMD_WRITE_SECTORS_EXT 0x34u
|
|
#define ATA_CMD_CACHE_FLUSH_EXT 0xEAu
|
|
|
|
#define ATA_IDENT_CAPABILITIES 49u
|
|
#define ATA_IDENT_COMMAND_SETS 83u
|
|
#define ATA_IDENT_LBA28_SECTORS_LO 60u
|
|
#define ATA_IDENT_LBA28_SECTORS_HI 61u
|
|
#define ATA_IDENT_LBA48_SECTORS 100u
|
|
#define ATA_IDENT_LBA_SUPPORTED (1u << 9)
|
|
#define ATA_IDENT_LBA48_SUPPORTED (1u << 10)
|
|
|
|
#define ATA_SECTOR_SIZE 512u
|
|
#define ATA_POLL_LIMIT 100000u
|
|
|
|
struct ATA_CONTROLLER;
|
|
struct ATA_CHANNEL;
|
|
|
|
typedef struct ATA_DEVICE {
|
|
uint32_t Magic;
|
|
struct ATA_CONTROLLER* Controller;
|
|
struct ATA_CHANNEL* Channel;
|
|
|
|
DEVICE_OBJECT* DeviceObject;
|
|
uint8_t Drive; // 0=master, 1=slave
|
|
uint8_t DiskIndex;
|
|
|
|
bool Present;
|
|
bool SupportsLba48;
|
|
uint64_t SectorCount;
|
|
|
|
IRP_QUEUE IrpQueue;
|
|
SEMAPHORE* IrpSemaphore;
|
|
IO_REMOVE_LOCK RemoveLock;
|
|
THREAD* WorkerThread;
|
|
} ATA_DEVICE;
|
|
|
|
typedef struct ATA_CHANNEL {
|
|
struct ATA_CONTROLLER* Controller;
|
|
uint8_t Index;
|
|
|
|
uint16_t CommandBase;
|
|
uint16_t ControlBase;
|
|
uint8_t Irq;
|
|
bool NativeMode;
|
|
|
|
SEMAPHORE* Lock;
|
|
ATA_DEVICE Devices[ATA_DRIVES_PER_CHANNEL];
|
|
} ATA_CHANNEL;
|
|
|
|
typedef struct ATA_CONTROLLER {
|
|
uint32_t Magic;
|
|
|
|
DEVICE_OBJECT* Fdo;
|
|
DEVICE_OBJECT* Pdo;
|
|
DEVICE_OBJECT* LowerDevice;
|
|
|
|
PCI_DEVICE_INFO PciInfo;
|
|
bool Started;
|
|
bool Removed;
|
|
bool SurpriseRemoved;
|
|
|
|
ATA_CHANNEL Channels[ATA_CHANNEL_COUNT];
|
|
uint8_t DeviceCount;
|
|
} ATA_CONTROLLER;
|
|
|
|
extern const HAL_API* gAtaHal;
|
|
|
|
KSTATUS AtaAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject);
|
|
KSTATUS AtaDispatchPnp(DEVICE_OBJECT* device, IRP* irp);
|
|
KSTATUS AtaDispatchReadWrite(DEVICE_OBJECT* device, IRP* irp);
|