tsunami_cchip.cc revision 768
112855Sgabeblack@google.com/* $Id$ */ 212855Sgabeblack@google.com 312855Sgabeblack@google.com/* @file 412855Sgabeblack@google.com * Tsunami CChip (processor, memory, or IO) 512855Sgabeblack@google.com */ 612855Sgabeblack@google.com 712855Sgabeblack@google.com#include <deque> 812855Sgabeblack@google.com#include <string> 912855Sgabeblack@google.com#include <vector> 1012855Sgabeblack@google.com 1112855Sgabeblack@google.com#include "base/trace.hh" 1212855Sgabeblack@google.com#include "cpu/exec_context.hh" 1312855Sgabeblack@google.com#include "dev/console.hh" 1412855Sgabeblack@google.com#include "dev/etherdev.hh" 1512855Sgabeblack@google.com#include "dev/scsi_ctrl.hh" 1612855Sgabeblack@google.com#include "dev/tlaser_clock.hh" 1712855Sgabeblack@google.com#include "dev/tsunami_cchip.hh" 1812855Sgabeblack@google.com#include "dev/tsunamireg.h" 1912855Sgabeblack@google.com#include "dev/tsunami.hh" 2012855Sgabeblack@google.com#include "mem/functional_mem/memory_control.hh" 2112855Sgabeblack@google.com#include "sim/builder.hh" 2212855Sgabeblack@google.com#include "sim/system.hh" 2312855Sgabeblack@google.com 2412855Sgabeblack@google.comusing namespace std; 2512855Sgabeblack@google.com 2612855Sgabeblack@google.comTsunamiCChip::TsunamiCChip(const string &name, /*Tsunami *t,*/ 2712855Sgabeblack@google.com Addr addr, Addr mask, MemoryController *mmu) 2812855Sgabeblack@google.com : MmapDevice(name, addr, mask, mmu)/*, tsunami(t) */ 2912855Sgabeblack@google.com{ 3012855Sgabeblack@google.com for(int i=0; i < Tsunami::Max_CPUs; i++) { 3112855Sgabeblack@google.com dim[i] = 0; 3212855Sgabeblack@google.com dir[i] = 0; 3312855Sgabeblack@google.com } 3412855Sgabeblack@google.com 3512855Sgabeblack@google.com drir = 0; 3612855Sgabeblack@google.com} 3712855Sgabeblack@google.com 3812855Sgabeblack@google.comFault 3912855Sgabeblack@google.comTsunamiCChip::read(MemReqPtr req, uint8_t *data) 4012855Sgabeblack@google.com{ 4112855Sgabeblack@google.com DPRINTF(Tsunami, "read va=%#x size=%d\n", 4212855Sgabeblack@google.com req->vaddr, req->size); 4312855Sgabeblack@google.com 4412855Sgabeblack@google.com Addr daddr = (req->paddr & addr_mask) >> 6; 4512855Sgabeblack@google.com// ExecContext *xc = req->xc; 4612855Sgabeblack@google.com// int cpuid = xc->cpu_id; 4712855Sgabeblack@google.com 4812855Sgabeblack@google.com switch (req->size) { 4912855Sgabeblack@google.com 5012855Sgabeblack@google.com case sizeof(uint64_t): 5112855Sgabeblack@google.com switch(daddr) { 5212855Sgabeblack@google.com case TSDEV_CC_CSR: 5312855Sgabeblack@google.com *(uint64_t*)data = 0x0; 5412855Sgabeblack@google.com return No_Fault; 5512855Sgabeblack@google.com case TSDEV_CC_MTR: 5612855Sgabeblack@google.com panic("TSDEV_CC_MTR not implemeted\n"); 5712855Sgabeblack@google.com return No_Fault; 5812855Sgabeblack@google.com case TSDEV_CC_MISC: 5912855Sgabeblack@google.com panic("TSDEV_CC_MISC not implemented\n"); 6012855Sgabeblack@google.com return No_Fault; 6112855Sgabeblack@google.com case TSDEV_CC_AAR0: 6212855Sgabeblack@google.com case TSDEV_CC_AAR1: 6312855Sgabeblack@google.com case TSDEV_CC_AAR2: 6412855Sgabeblack@google.com case TSDEV_CC_AAR3: 6512855Sgabeblack@google.com panic("TSDEV_CC_AARx not implemeted\n"); 6612855Sgabeblack@google.com return No_Fault; 6712855Sgabeblack@google.com case TSDEV_CC_DIM0: 6812855Sgabeblack@google.com *(uint64_t*)data = dim[0]; 6912855Sgabeblack@google.com return No_Fault; 7012855Sgabeblack@google.com case TSDEV_CC_DIM1: 7112855Sgabeblack@google.com *(uint64_t*)data = dim[1]; 7212855Sgabeblack@google.com return No_Fault; 7312855Sgabeblack@google.com case TSDEV_CC_DIM2: 7412855Sgabeblack@google.com *(uint64_t*)data = dim[2]; 7512855Sgabeblack@google.com return No_Fault; 7612855Sgabeblack@google.com case TSDEV_CC_DIM3: 7712855Sgabeblack@google.com *(uint64_t*)data = dim[3]; 7812855Sgabeblack@google.com return No_Fault; 7912855Sgabeblack@google.com case TSDEV_CC_DIR0: 8012855Sgabeblack@google.com *(uint64_t*)data = dir[0]; 8112855Sgabeblack@google.com return No_Fault; 8212855Sgabeblack@google.com case TSDEV_CC_DIR1: 8312855Sgabeblack@google.com *(uint64_t*)data = dir[1]; 8412855Sgabeblack@google.com return No_Fault; 8512855Sgabeblack@google.com case TSDEV_CC_DIR2: 8612855Sgabeblack@google.com *(uint64_t*)data = dir[2]; 8712855Sgabeblack@google.com return No_Fault; 8812855Sgabeblack@google.com case TSDEV_CC_DIR3: 8912855Sgabeblack@google.com *(uint64_t*)data = dir[3]; 9012855Sgabeblack@google.com return No_Fault; 9112855Sgabeblack@google.com case TSDEV_CC_DRIR: 9212855Sgabeblack@google.com *(uint64_t*)data = drir; 9312855Sgabeblack@google.com return No_Fault; 9412855Sgabeblack@google.com 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