#include "sim/builder.hh"
#include "sim/param.hh"
#include "sim/universe.hh"
+#include "dev/tsunamireg.h"
using namespace std;
if(config.data[offset] & 0x1) {
*(uint32_t *)&config.data[offset] = (word_value & ~0x3) |
(config.data[offset] & 0x3);
- if (word_value) {
+
+ if (word_value & ~0x1) {
// It's never been set
if (BARAddrs[barnum] == 0)
- AddMapping(word_value, BARSize[barnum]-1, MMU);
+ AddMapping((word_value & ~0x1) + TSUNAMI_PCI0_IO,
+ BARSize[barnum]-1, MMU);
else
ChangeMapping(BARAddrs[barnum], BARSize[barnum]-1,
- word_value, BARSize[barnum]-1, MMU);
- BARAddrs[barnum] = word_value;
+ (word_value & ~0x1) + TSUNAMI_PCI0_IO,
+ BARSize[barnum]-1, MMU);
+ BARAddrs[barnum] = (word_value & ~0x1) + TSUNAMI_PCI0_IO;
}
} else {
// This is memory space, bottom four bits are read only
*(uint32_t *)&config.data[offset] = (word_value & ~0xF) |
(config.data[offset] & 0xF);
- }
+
+ if (word_value & ~0x3) {
+ // It's never been set
+ if (BARAddrs[barnum] == 0)
+ AddMapping((word_value & ~0x3) + TSUNAMI_PCI0_MEMORY,
+ BARSize[barnum]-1, MMU);
+ else
+ ChangeMapping(BARAddrs[barnum], BARSize[barnum]-1,
+ (word_value & ~0x3) +
+ TSUNAMI_PCI0_MEMORY,
+ BARSize[barnum]-1, MMU);
+ BARAddrs[barnum] = (word_value & ~0x3) +
+ TSUNAMI_PCI0_MEMORY;
+ }
+ }
}
break;
#ifndef __TSUNAMIREG_H__
#define __TSUNAMIREG_H__
+#define ALPHA_K0SEG_BASE 0xfffffc0000000000
+
// CChip Registers
#define TSDEV_CC_CSR 0x00
#define TSDEV_CC_MTR 0x01
#define RTC_CONTROL_REGISTERD 13 // control register D
#define RTC_REGNUMBER_RTC_CR1 0x6A // control register 1
+#define PCHIP_PCI0_MEMORY 0x10000000000
+#define PCHIP_PCI0_IO 0x101FC000000
+#define TSUNAMI_PCI0_MEMORY ALPHA_K0SEG_BASE + PCHIP_PCI0_MEMORY
+#define TSUNAMI_PCI0_IO ALPHA_K0SEG_BASE + PCHIP_PCI0_IO
+
#endif // __TSUNAMIREG_H__