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