X86: Put an RTC into the CMOS part of the southbridge.

--HG--
extra : convert_revision : a614373236fe75db6e6181fc152a02b541a131f3
This commit is contained in:
Gabe Black 2008-03-25 02:15:23 -04:00
parent e5bdae15f3
commit 93dd1978a7
2 changed files with 29 additions and 43 deletions

View file

@ -71,27 +71,10 @@ uint8_t
X86ISA::Cmos::readRegister(uint8_t reg) X86ISA::Cmos::readRegister(uint8_t reg)
{ {
assert(reg < numRegs); assert(reg < numRegs);
switch(reg) if (reg <= 0xD) {
{ return rtc.readData(reg);
case 0x0: } else {
case 0x1:
case 0x2:
case 0x3:
case 0x4:
case 0x5:
case 0x6:
case 0x7:
case 0x8:
case 0x9:
case 0xA:
case 0xB:
case 0xC:
case 0xD:
warn("Reading RTC in the CMOS.\n");
break;
default:
warn("Reading non-volitile CMOS address %x as %x.\n", reg, regs[reg]); warn("Reading non-volitile CMOS address %x as %x.\n", reg, regs[reg]);
break;
} }
return regs[reg]; return regs[reg];
} }
@ -100,27 +83,11 @@ void
X86ISA::Cmos::writeRegister(uint8_t reg, uint8_t val) X86ISA::Cmos::writeRegister(uint8_t reg, uint8_t val)
{ {
assert(reg < numRegs); assert(reg < numRegs);
switch(reg) if (reg <= 0xD) {
{ rtc.writeData(reg, val);
case 0x0: return;
case 0x1: } else {
case 0x2:
case 0x3:
case 0x4:
case 0x5:
case 0x6:
case 0x7:
case 0x8:
case 0x9:
case 0xA:
case 0xB:
case 0xC:
case 0xD:
warn("Writing RTC in the CMOS.\n");
break;
default:
warn("Writing non-volitile CMOS address %x with %x.\n", reg, val); warn("Writing non-volitile CMOS address %x with %x.\n", reg, val);
break;
} }
regs[reg] = val; regs[reg] = val;
} }

View file

@ -33,6 +33,7 @@
#include "arch/x86/x86_traits.hh" #include "arch/x86/x86_traits.hh"
#include "base/range.hh" #include "base/range.hh"
#include "dev/mc146818.hh"
#include "dev/x86/south_bridge/sub_device.hh" #include "dev/x86/south_bridge/sub_device.hh"
namespace X86ISA namespace X86ISA
@ -43,6 +44,8 @@ class Cmos : public SubDevice
protected: protected:
uint8_t address; uint8_t address;
struct tm foo_time;
static const int numRegs = 128; static const int numRegs = 128;
uint8_t regs[numRegs]; uint8_t regs[numRegs];
@ -50,22 +53,38 @@ class Cmos : public SubDevice
uint8_t readRegister(uint8_t reg); uint8_t readRegister(uint8_t reg);
void writeRegister(uint8_t reg, uint8_t val); void writeRegister(uint8_t reg, uint8_t val);
class X86RTC : public MC146818
{
public:
X86RTC(const std::string &n, const struct tm time,
bool bcd, Tick frequency) : MC146818(n, time, bcd, frequency)
{
}
protected:
void handleEvent()
{
return;
}
} rtc;
public: public:
Cmos() Cmos() : rtc("rtc", foo_time, true, 5000000000)
{ {
memset(regs, 0, numRegs * sizeof(uint8_t)); memset(regs, 0, numRegs * sizeof(uint8_t));
address = 0; address = 0;
} }
Cmos(Tick _latency) : SubDevice(_latency) Cmos(Tick _latency) : SubDevice(_latency),
rtc("rtc", foo_time, true, 5000000000)
{ {
memset(regs, 0, numRegs * sizeof(uint8_t)); memset(regs, 0, numRegs * sizeof(uint8_t));
address = 0; address = 0;
} }
Cmos(Addr start, Addr size, Tick _latency) : Cmos(Addr start, Addr size, Tick _latency) :
SubDevice(start, size, _latency) SubDevice(start, size, _latency),
rtc("rtc", foo_time, true, 5000000000)
{ {
memset(regs, 0, numRegs * sizeof(uint8_t)); memset(regs, 0, numRegs * sizeof(uint8_t));
address = 0; address = 0;