Update coding style of ATA driver.

This commit is contained in:
Jonas 'Sortie' Termansen 2012-10-17 11:33:47 +02:00
parent c9b3002e43
commit 4f60d028ef
2 changed files with 358 additions and 355 deletions

View File

@ -33,60 +33,60 @@
// TODO: Use the PCI to detect ATA devices instead of relying on them being on
// standard locations.
namespace Sortix
{
const uint16_t PRIMARY_BUS_OFFSET = 0x1F0;
const uint16_t SECONDARY_BUS_OFFSET = 0x170;
const uint16_t DATA = 0x0;
const uint16_t FEATURE = 0x1;
const uint16_t ERROR = 0x1;
const uint16_t SECTOR_COUNT = 0x2;
const uint16_t LBA_LOW = 0x3;
const uint16_t LBA_MID = 0x4;
const uint16_t LBA_HIGH = 0x5;
const uint16_t DRIVE_SELECT = 0x6;
const uint16_t COMMAND = 0x7;
const uint16_t STATUS = 0x7;
const uint8_t CMD_READ = 0x20;
const uint8_t CMD_READ_EXT = 0x24;
const uint8_t CMD_WRITE = 0x30;
const uint8_t CMD_WRITE_EXT = 0x34;
const uint8_t CMD_FLUSH_CACHE = 0xE7;
const uint8_t CMD_IDENTIFY = 0xEC;
const uint8_t STATUS_ERROR = (1<<0);
const uint8_t STATUS_DATAREADY = (1<<3);
const uint8_t STATUS_DRIVEFAULT = (1<<5);
const uint8_t STATUS_BUSY = (1<<7);
const uint8_t CTL_NO_INTERRUPT = (1<<1);
const uint8_t CTL_RESET = (1<<2);
namespace Sortix {
namespace ATA
{
void DetectDrive(unsigned busid, ATABus* bus, unsigned driveid)
{
const uint16_t PRIMARY_BUS_OFFSET = 0x1F0;
const uint16_t SECONDARY_BUS_OFFSET = 0x170;
const uint16_t DATA = 0x0;
const uint16_t FEATURE = 0x1;
const uint16_t ERROR = 0x1;
const uint16_t SECTOR_COUNT = 0x2;
const uint16_t LBA_LOW = 0x3;
const uint16_t LBA_MID = 0x4;
const uint16_t LBA_HIGH = 0x5;
const uint16_t DRIVE_SELECT = 0x6;
const uint16_t COMMAND = 0x7;
const uint16_t STATUS = 0x7;
const uint8_t CMD_READ = 0x20;
const uint8_t CMD_READ_EXT = 0x24;
const uint8_t CMD_WRITE = 0x30;
const uint8_t CMD_WRITE_EXT = 0x34;
const uint8_t CMD_FLUSH_CACHE = 0xE7;
const uint8_t CMD_IDENTIFY = 0xEC;
const uint8_t STATUS_ERROR = (1<<0);
const uint8_t STATUS_DATAREADY = (1<<3);
const uint8_t STATUS_DRIVEFAULT = (1<<5);
const uint8_t STATUS_BUSY = (1<<7);
const uint8_t CTL_NO_INTERRUPT = (1<<1);
const uint8_t CTL_RESET = (1<<2);
namespace ATA {
void DetectDrive(unsigned busid, ATABus* bus, unsigned driveid)
{
unsigned ataid = busid*2 + driveid;
ATADrive* drive = bus->Instatiate(driveid);
if ( !drive ) { return; }
DeviceFS::RegisterATADrive(ataid, drive);
}
}
void DetectBus(unsigned busid, uint16_t ioport, uint16_t altio)
{
void DetectBus(unsigned busid, uint16_t ioport, uint16_t altio)
{
ATABus* bus = ATA::CreateBus(ioport, altio);
if ( !bus )
return;
DetectDrive(busid, bus, 0);
DetectDrive(busid, bus, 1);
}
}
void Init()
{
void Init()
{
DetectBus(0, 0x1F0, 0x3F6);
DetectBus(1, 0x170, 0x366);
}
}
ATABus* CreateBus(uint16_t portoffset, uint16_t altport)
{
ATABus* CreateBus(uint16_t portoffset, uint16_t altport)
{
unsigned status = CPU::InPortB(portoffset + STATUS);
// Detect if there is no such bus.
if ( status == 0xFF )
@ -95,28 +95,29 @@ namespace Sortix
return NULL;
}
return new ATABus(portoffset, altport);
}
}
}
void Wait400NSecs(uint16_t iobase)
{
} // namespace ATA
void Wait400NSecs(uint16_t iobase)
{
// Now wait 400 ns for the drive to be ready.
for ( unsigned i = 0; i < 4; i++ ) { CPU::InPortB(iobase + STATUS); }
}
}
ATABus::ATABus(uint16_t portoffset, uint16_t altport)
{
ATABus::ATABus(uint16_t portoffset, uint16_t altport)
{
this->iobase = portoffset;
this->altport = altport;
this->curdriveid = 0;
}
}
ATABus::~ATABus()
{
}
ATABus::~ATABus()
{
}
ATADrive* ATABus::Instatiate(unsigned driveid)
{
ATADrive* ATABus::Instatiate(unsigned driveid)
{
if ( 1 < driveid ) { errno = EINVAL; return false; }
curdriveid = 0;
@ -167,10 +168,10 @@ namespace Sortix
}
ATADrive* drive = new ATADrive(this, driveid, iobase, altport);
return drive;
}
}
bool ATABus::SelectDrive(unsigned driveid)
{
bool ATABus::SelectDrive(unsigned driveid)
{
if ( driveid == curdriveid ) { return true; }
if ( 1 < driveid ) { errno = EINVAL; return false; }
@ -178,15 +179,15 @@ namespace Sortix
CPU::OutPortB(iobase + DRIVE_SELECT, drivemagic);
Wait400NSecs(iobase);
return true;
}
}
const size_t META_LBA28 = 60;
const size_t META_FLAGS = 83;
const size_t META_LBA48 = 100;
const uint16_t FLAG_LBA48 = (1<<10);
const size_t META_LBA28 = 60;
const size_t META_FLAGS = 83;
const size_t META_LBA48 = 100;
const uint16_t FLAG_LBA48 = (1<<10);
ATADrive::ATADrive(ATABus* bus, unsigned driveid, uint16_t portoffset, uint16_t altport)
{
ATADrive::ATADrive(ATABus* bus, unsigned driveid, uint16_t portoffset, uint16_t altport)
{
this->atalock = KTHREAD_MUTEX_INITIALIZER;
this->bus = bus;
this->driveid = driveid;
@ -207,24 +208,24 @@ namespace Sortix
}
sectorsize = 512; // TODO: Detect this!
Initialize();
}
}
ATADrive::~ATADrive()
{
}
ATADrive::~ATADrive()
{
}
off_t ATADrive::GetSectorSize()
{
off_t ATADrive::GetSectorSize()
{
return sectorsize;
}
}
off_t ATADrive::GetNumSectors()
{
off_t ATADrive::GetNumSectors()
{
return numsectors;
}
}
bool ATADrive::PrepareIO(bool write, off_t sector)
{
bool ATADrive::PrepareIO(bool write, off_t sector)
{
if ( numsectors <= sector ) { errno = EINVAL; return false; }
if ( write && !ENABLE_DISKWRITE )
{
@ -262,10 +263,10 @@ namespace Sortix
if ( status & STATUS_DRIVEFAULT ) { errno = EIO; return false; }
}
return true;
}
}
bool ATADrive::ReadSector(off_t sector, uint8_t* dest)
{
bool ATADrive::ReadSector(off_t sector, uint8_t* dest)
{
ScopedLock lock(&atalock);
if ( !PrepareIO(false, sector) ) { return false; }
uint16_t* destword = (uint16_t*) dest;
@ -276,10 +277,10 @@ namespace Sortix
Wait400NSecs(iobase);
uint8_t status = CPU::InPortB(iobase + STATUS);
return true;
}
}
bool ATADrive::WriteSector(off_t sector, const uint8_t* src)
{
bool ATADrive::WriteSector(off_t sector, const uint8_t* src)
{
ScopedLock lock(&atalock);
if ( !PrepareIO(true, sector) ) { return false; }
const uint16_t* srcword = (const uint16_t*) src;
@ -297,10 +298,10 @@ namespace Sortix
if ( !(status & STATUS_BUSY) ) { break; }
}
return true;
}
}
size_t ATADrive::Read(off_t byteoffset, uint8_t* dest, size_t numbytes)
{
size_t ATADrive::Read(off_t byteoffset, uint8_t* dest, size_t numbytes)
{
size_t sofar = 0;
size_t leadingbytes = byteoffset % sectorsize;
if ( leadingbytes || numbytes < sectorsize )
@ -325,10 +326,10 @@ namespace Sortix
if ( numbytes ) { return sofar + Read(byteoffset, dest + sofar, numbytes); }
return sofar;
}
}
size_t ATADrive::Write(off_t byteoffset, const uint8_t* src, size_t numbytes)
{
size_t ATADrive::Write(off_t byteoffset, const uint8_t* src, size_t numbytes)
{
size_t sofar = 0;
size_t leadingbytes = byteoffset % sectorsize;
if ( leadingbytes || numbytes < sectorsize )
@ -354,12 +355,12 @@ namespace Sortix
if ( numbytes ) { return sofar + Write(byteoffset, src + sofar, numbytes); }
return sofar;
}
void ATADrive::Initialize()
{
bus->SelectDrive(driveid);
CPU::OutPortB(iobase + COMMAND, CTL_NO_INTERRUPT);
}
}
void ATADrive::Initialize()
{
bus->SelectDrive(driveid);
CPU::OutPortB(iobase + COMMAND, CTL_NO_INTERRUPT);
}
} // namespace Sortix

View File

@ -27,31 +27,31 @@
#include <sortix/kernel/kthread.h>
namespace Sortix
{
class ATABus;
class ATADrive;
namespace Sortix {
class ATABus
{
public:
class ATABus;
class ATADrive;
class ATABus
{
public:
ATABus(uint16_t portoffset, uint16_t altport);
~ATABus();
public:
public:
ATADrive* Instatiate(unsigned driveid);
bool SelectDrive(unsigned driveid);
private:
private:
unsigned curdriveid;
uint16_t iobase;
uint16_t altport;
};
};
class ATADrive
{
public:
class ATADrive
{
public:
off_t GetSectorSize();
off_t GetNumSectors();
off_t GetSize() { return GetSectorSize() * GetNumSectors(); }
@ -60,15 +60,15 @@ namespace Sortix
size_t Read(off_t byteoffset, uint8_t* dest, size_t numbytes);
size_t Write(off_t byteoffset, const uint8_t* src, size_t numbytes);
public:
public:
ATADrive(ATABus* bus, unsigned driveid, uint16_t portoffset, uint16_t altport);
~ATADrive();
private:
private:
void Initialize();
bool PrepareIO(bool write, off_t sector);
private:
private:
kthread_mutex_t atalock;
unsigned driveid;
uint16_t meta[256];
@ -79,13 +79,15 @@ namespace Sortix
size_t sectorsize;
off_t numsectors;
};
};
namespace ATA
{
void Init();
ATABus* CreateBus(uint16_t portoffset, uint16_t altport);
}
}
namespace ATA {
void Init();
ATABus* CreateBus(uint16_t portoffset, uint16_t altport);
} // namespace ATA
} // namespace Sortix
#endif