tsunami_cchip.cc revision 775
1/* $Id$ */ 2 3/* @file 4 * Tsunami CChip (processor, memory, or IO) 5 */ 6 7#include <deque> 8#include <string> 9#include <vector> 10 11#include "base/trace.hh" 12#include "cpu/exec_context.hh" 13#include "dev/console.hh" 14#include "dev/etherdev.hh" 15#include "dev/scsi_ctrl.hh" 16#include "dev/tlaser_clock.hh" 17#include "dev/tsunami_cchip.hh" 18#include "dev/tsunamireg.h" 19#include "dev/tsunami.hh" 20#include "cpu/intr_control.hh" 21#include "mem/functional_mem/memory_control.hh" 22#include "sim/builder.hh" 23#include "sim/system.hh" 24 25using namespace std; 26 27TsunamiCChip::TsunamiCChip(const string &name, Tsunami *t, 28 Addr addr, Addr mask, MemoryController *mmu) 29 : MmapDevice(name, addr, mask, mmu), tsunami(t) 30{ 31 for(int i=0; i < Tsunami::Max_CPUs; i++) { 32 dim[i] = 0; 33 dir[i] = 0; 34 } 35 36 drir = 0; 37 misc = 0; 38 RTCInterrupting = false; 39 40 //Put back pointer in tsunami 41 tsunami->cchip = this; 42} 43 44Fault 45TsunamiCChip::read(MemReqPtr req, uint8_t *data) 46{ 47 DPRINTF(Tsunami, "read va=%#x size=%d\n", 48 req->vaddr, req->size); 49 50 Addr daddr = (req->paddr & addr_mask) >> 6; 51// ExecContext *xc = req->xc; 52// int cpuid = xc->cpu_id; 53 54 switch (req->size) { 55 56 case sizeof(uint64_t): 57 switch(daddr) { 58 case TSDEV_CC_CSR: 59 *(uint64_t*)data = 0x0; 60 return No_Fault; 61 case TSDEV_CC_MTR: 62 panic("TSDEV_CC_MTR not implemeted\n"); 63 return No_Fault; 64 case TSDEV_CC_MISC: 65 *(uint64_t*)data = misc; 66 return No_Fault; 67 case TSDEV_CC_AAR0: 68 case TSDEV_CC_AAR1: 69 case TSDEV_CC_AAR2: 70 case TSDEV_CC_AAR3: 71 panic("TSDEV_CC_AARx not implemeted\n"); 72 return No_Fault; 73 case TSDEV_CC_DIM0: 74 *(uint64_t*)data = dim[0]; 75 return No_Fault; 76 case TSDEV_CC_DIM1: 77 *(uint64_t*)data = dim[1]; 78 return No_Fault; 79 case TSDEV_CC_DIM2: 80 *(uint64_t*)data = dim[2]; 81 return No_Fault; 82 case TSDEV_CC_DIM3: 83 *(uint64_t*)data = dim[3]; 84 return No_Fault; 85 case TSDEV_CC_DIR0: 86 *(uint64_t*)data = dir[0]; 87 return No_Fault; 88 case TSDEV_CC_DIR1: 89 *(uint64_t*)data = dir[1]; 90 return No_Fault; 91 case TSDEV_CC_DIR2: 92 *(uint64_t*)data = dir[2]; 93 return No_Fault; 94 case TSDEV_CC_DIR3: 95 *(uint64_t*)data = dir[3]; 96 return No_Fault; 97 case TSDEV_CC_DRIR: 98 *(uint64_t*)data = drir; 99 return No_Fault; 100 case TSDEV_CC_PRBEN: 101 panic("TSDEV_CC_PRBEN not implemented\n"); 102 return No_Fault; 103 case TSDEV_CC_IIC0: 104 case TSDEV_CC_IIC1: 105 case TSDEV_CC_IIC2: 106 case TSDEV_CC_IIC3: 107 panic("TSDEV_CC_IICx not implemented\n"); 108 return No_Fault; 109 case TSDEV_CC_MPR0: 110 case TSDEV_CC_MPR1: 111 case TSDEV_CC_MPR2: 112 case TSDEV_CC_MPR3: 113 panic("TSDEV_CC_MPRx not implemented\n"); 114 return No_Fault; 115 default: 116 panic("default in cchip read reached, accessing 0x%x\n"); 117 } // uint64_t 118 119 break; 120 case sizeof(uint32_t): 121 case sizeof(uint16_t): 122 case sizeof(uint8_t): 123 default: 124 panic("invalid access size(?) for tsunami register!\n"); 125 } 126 DPRINTFN("Tsunami CChip ERROR: read daddr=%#x size=%d\n", daddr, req->size); 127 128 return No_Fault; 129} 130 131Fault 132TsunamiCChip::write(MemReqPtr req, const uint8_t *data) 133{ 134 DPRINTF(Tsunami, "write - va=%#x size=%d \n", 135 req->vaddr, req->size); 136 137 Addr daddr = (req->paddr & addr_mask) >> 6; 138 139 switch (req->size) { 140 141 case sizeof(uint64_t): 142 switch(daddr) { 143 case TSDEV_CC_CSR: 144 panic("TSDEV_CC_CSR write\n"); 145 return No_Fault; 146 case TSDEV_CC_MTR: 147 panic("TSDEV_CC_MTR write not implemented\n"); 148 return No_Fault; 149 case TSDEV_CC_MISC: 150 //If it is the seventh bit, clear the RTC interrupt 151 if ((*(uint64_t*) data) & (1<<7)) { 152 RTCInterrupting = false; 153 tsunami->intrctrl->clear(0, TheISA::INTLEVEL_IRQ2, 0); 154 misc &= ~(1<<7); 155 } else panic("TSDEV_CC_MISC write not implemented\n"); 156 return No_Fault; 157 case TSDEV_CC_AAR0: 158 case TSDEV_CC_AAR1: 159 case TSDEV_CC_AAR2: 160 case TSDEV_CC_AAR3: 161 panic("TSDEV_CC_AARx write not implemeted\n"); 162 return No_Fault; 163 case TSDEV_CC_DIM0: 164 dim[0] = *(uint64_t*)data; 165 return No_Fault; 166 case TSDEV_CC_DIM1: 167 dim[1] = *(uint64_t*)data; 168 return No_Fault; 169 case TSDEV_CC_DIM2: 170 dim[2] = *(uint64_t*)data; 171 return No_Fault; 172 case TSDEV_CC_DIM3: 173 dim[3] = *(uint64_t*)data; 174 return No_Fault; 175 case TSDEV_CC_DIR0: 176 case TSDEV_CC_DIR1: 177 case TSDEV_CC_DIR2: 178 case TSDEV_CC_DIR3: 179 panic("TSDEV_CC_DIR write not implemented\n"); 180 return No_Fault; 181 case TSDEV_CC_DRIR: 182 panic("TSDEV_CC_DRIR write not implemented\n"); 183 return No_Fault; 184 case TSDEV_CC_PRBEN: 185 panic("TSDEV_CC_PRBEN write not implemented\n"); 186 return No_Fault; 187 case TSDEV_CC_IIC0: 188 case TSDEV_CC_IIC1: 189 case TSDEV_CC_IIC2: 190 case TSDEV_CC_IIC3: 191 panic("TSDEV_CC_IICx write not implemented\n"); 192 return No_Fault; 193 case TSDEV_CC_MPR0: 194 case TSDEV_CC_MPR1: 195 case TSDEV_CC_MPR2: 196 case TSDEV_CC_MPR3: 197 panic("TSDEV_CC_MPRx write not implemented\n"); 198 return No_Fault; 199 default: 200 panic("default in cchip read reached, accessing 0x%x\n"); 201 } 202 203 break; 204 case sizeof(uint32_t): 205 case sizeof(uint16_t): 206 case sizeof(uint8_t): 207 default: 208 panic("invalid access size(?) for tsunami register!\n"); 209 } 210 211 DPRINTFN("Tsunami ERROR: write daddr=%#x size=%d\n", daddr, req->size); 212 213 return No_Fault; 214} 215 216void 217TsunamiCChip::serialize(std::ostream &os) 218{ 219 // code should be written 220} 221 222void 223TsunamiCChip::unserialize(Checkpoint *cp, const std::string §ion) 224{ 225 //code should be written 226} 227 228BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiCChip) 229 230 SimObjectParam<Tsunami *> tsunami; 231 SimObjectParam<MemoryController *> mmu; 232 Param<Addr> addr; 233 Param<Addr> mask; 234 235END_DECLARE_SIM_OBJECT_PARAMS(TsunamiCChip) 236 237BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiCChip) 238 239 INIT_PARAM(tsunami, "Tsunami"), 240 INIT_PARAM(mmu, "Memory Controller"), 241 INIT_PARAM(addr, "Device Address"), 242 INIT_PARAM(mask, "Address Mask") 243 244END_INIT_SIM_OBJECT_PARAMS(TsunamiCChip) 245 246CREATE_SIM_OBJECT(TsunamiCChip) 247{ 248 return new TsunamiCChip(getInstanceName(), tsunami, addr, mask, mmu); 249} 250 251REGISTER_SIM_OBJECT("TsunamiCChip", TsunamiCChip) 252