#pragma once

#include <kint.h>

/**
 * ATA PIO Driver for Bluejay. This should be replaced by a proper
 * ATAPI driver later on, but for now this will do. It is going to
 * be horribly slow by virtue of having to pass all data through
 * in() and out().
 */

// status codes
enum
{
	ATA_BSY = 0x80, // Busy
	ATA_RDY = 0x40, // Ready for command
	ATA_DRQ = 0x08, // Ready for data
	ATA_DF = 0x20,
	ATA_ERR = 0x01, // Error code placed in error register
};

// IO ports
enum
{
	ATA_PORT_CMD = 0x1f7,
	ATA_PORT_DATA = 0x1f0,
	ATA_PORT_DRIVE_SEL = 0x1f6,
	ATA_PORT_SECTOR_COUNT = 0x1f2,
	ATA_PORT_LBA_LOW,
	ATA_PORT_LBA_MID,
	ATA_PORT_LBA_HIGH,
	ATA_PORT_STATUS = ATA_PORT_CMD,
};

// Commands
enum
{
	/// Do not retry
	ATA_CMD_READ = 0x21,
	/// Do not retry
	ATA_CMD_WRITE = 0x31,
	ATA_CMD_IDENTIFY = 0xec,
	ATA_CMD_FLUSH_CACHE = 0xe7,
};

void ata_pio_wait_bsy();
void ata_pio_wait_drq();
void ata_pio_read_sectors(void *buffer, uint lba, uchar num_sectors);
void ata_pio_write_sectors(uint lba, uchar num_sectors, ushort *buffer);
uint ata_pio_get_error();

void test_ata_pio();

void init_ata_pio();
