tsunami_pchip.cc revision 775
14484Sbinkertn@umich.edu/* $Id$ */ 24484Sbinkertn@umich.edu 34484Sbinkertn@umich.edu/* @file 44484Sbinkertn@umich.edu * Tsunami PChip (pci) 54484Sbinkertn@umich.edu */ 64484Sbinkertn@umich.edu 74484Sbinkertn@umich.edu#include <deque> 84484Sbinkertn@umich.edu#include <string> 94484Sbinkertn@umich.edu#include <vector> 104484Sbinkertn@umich.edu 114484Sbinkertn@umich.edu#include "base/trace.hh" 124484Sbinkertn@umich.edu#include "cpu/exec_context.hh" 134484Sbinkertn@umich.edu#include "dev/console.hh" 144484Sbinkertn@umich.edu#include "dev/etherdev.hh" 154484Sbinkertn@umich.edu#include "dev/scsi_ctrl.hh" 164484Sbinkertn@umich.edu#include "dev/tlaser_clock.hh" 174484Sbinkertn@umich.edu#include "dev/tsunami_pchip.hh" 184484Sbinkertn@umich.edu#include "dev/tsunamireg.h" 194484Sbinkertn@umich.edu#include "dev/tsunami.hh" 204484Sbinkertn@umich.edu#include "mem/functional_mem/memory_control.hh" 214484Sbinkertn@umich.edu#include "sim/builder.hh" 224484Sbinkertn@umich.edu#include "sim/system.hh" 234484Sbinkertn@umich.edu 244484Sbinkertn@umich.eduusing namespace std; 254484Sbinkertn@umich.edu 264484Sbinkertn@umich.eduTsunamiPChip::TsunamiPChip(const string &name, Tsunami *t, 274484Sbinkertn@umich.edu Addr addr, Addr mask, MemoryController *mmu) 284484Sbinkertn@umich.edu : MmapDevice(name, addr, mask, mmu), tsunami(t) 294484Sbinkertn@umich.edu{ 304484Sbinkertn@umich.edu wsba0 = 0; 314484Sbinkertn@umich.edu wsba1 = 0; 324484Sbinkertn@umich.edu wsba2 = 0; 334484Sbinkertn@umich.edu wsba3 = 0; 344484Sbinkertn@umich.edu wsm0 = 0; 354484Sbinkertn@umich.edu wsm1 = 0; 364484Sbinkertn@umich.edu wsm2 = 0; 374484Sbinkertn@umich.edu wsm3 = 0; 384484Sbinkertn@umich.edu tba0 = 0; 394484Sbinkertn@umich.edu tba1 = 0; 404484Sbinkertn@umich.edu tba2 = 0; 414484Sbinkertn@umich.edu tba3 = 0; 424484Sbinkertn@umich.edu 434484Sbinkertn@umich.edu //Set back pointer in tsunami 444484Sbinkertn@umich.edu tsunami->pchip = this; 454484Sbinkertn@umich.edu} 464484Sbinkertn@umich.edu 474484Sbinkertn@umich.eduFault 484484Sbinkertn@umich.eduTsunamiPChip::read(MemReqPtr req, uint8_t *data) 494484Sbinkertn@umich.edu{ 504484Sbinkertn@umich.edu DPRINTF(Tsunami, "read va=%#x size=%d\n", 514484Sbinkertn@umich.edu req->vaddr, req->size); 524484Sbinkertn@umich.edu 534484Sbinkertn@umich.edu Addr daddr = (req->paddr & addr_mask) >> 6; 544484Sbinkertn@umich.edu// ExecContext *xc = req->xc; 554484Sbinkertn@umich.edu// int cpuid = xc->cpu_id; 564484Sbinkertn@umich.edu 574484Sbinkertn@umich.edu switch (req->size) { 584484Sbinkertn@umich.edu 594484Sbinkertn@umich.edu case sizeof(uint64_t): 604484Sbinkertn@umich.edu switch(daddr) { 614484Sbinkertn@umich.edu case TSDEV_PC_WSBA0: 624484Sbinkertn@umich.edu *(uint64_t*)data = wsba0; 634484Sbinkertn@umich.edu return No_Fault; 644484Sbinkertn@umich.edu case TSDEV_PC_WSBA1: 654484Sbinkertn@umich.edu *(uint64_t*)data = wsba1; 664484Sbinkertn@umich.edu return No_Fault; 674484Sbinkertn@umich.edu case TSDEV_PC_WSBA2: 684484Sbinkertn@umich.edu *(uint64_t*)data = wsba2; 694484Sbinkertn@umich.edu return No_Fault; 704484Sbinkertn@umich.edu case TSDEV_PC_WSBA3: 714484Sbinkertn@umich.edu *(uint64_t*)data = wsba3; 724484Sbinkertn@umich.edu return No_Fault; 734484Sbinkertn@umich.edu case TSDEV_PC_WSM0: 744484Sbinkertn@umich.edu *(uint64_t*)data = wsm0; 754484Sbinkertn@umich.edu return No_Fault; 764484Sbinkertn@umich.edu case TSDEV_PC_WSM1: 774484Sbinkertn@umich.edu *(uint64_t*)data = wsm1; 784484Sbinkertn@umich.edu return No_Fault; 794484Sbinkertn@umich.edu case TSDEV_PC_WSM2: 804484Sbinkertn@umich.edu *(uint64_t*)data = wsm2; 814484Sbinkertn@umich.edu return No_Fault; 824484Sbinkertn@umich.edu case TSDEV_PC_WSM3: 834484Sbinkertn@umich.edu *(uint64_t*)data = wsm3; 844484Sbinkertn@umich.edu return No_Fault; 854484Sbinkertn@umich.edu case TSDEV_PC_TBA0: 864484Sbinkertn@umich.edu *(uint64_t*)data = tba0; 874484Sbinkertn@umich.edu return No_Fault; 884484Sbinkertn@umich.edu case TSDEV_PC_TBA1: 894484Sbinkertn@umich.edu *(uint64_t*)data = tba1; 904484Sbinkertn@umich.edu return No_Fault; 914484Sbinkertn@umich.edu case TSDEV_PC_TBA2: 924484Sbinkertn@umich.edu *(uint64_t*)data = tba2; 934484Sbinkertn@umich.edu return No_Fault; 944484Sbinkertn@umich.edu case TSDEV_PC_TBA3: 954484Sbinkertn@umich.edu *(uint64_t*)data = tba3; 964484Sbinkertn@umich.edu return No_Fault; 974484Sbinkertn@umich.edu case TSDEV_PC_PCTL: 984484Sbinkertn@umich.edu // might want to change the clock?? 994484Sbinkertn@umich.edu *(uint64_t*)data = 0x00; // try this 1004484Sbinkertn@umich.edu return No_Fault; 1014484Sbinkertn@umich.edu case TSDEV_PC_PLAT: 1024484Sbinkertn@umich.edu panic("PC_PLAT not implemented\n"); 1034484Sbinkertn@umich.edu case TSDEV_PC_RES: 1044484Sbinkertn@umich.edu panic("PC_RES not implemented\n"); 1054484Sbinkertn@umich.edu case TSDEV_PC_PERROR: 1064484Sbinkertn@umich.edu panic("PC_PERROR not implemented\n"); 1074484Sbinkertn@umich.edu case TSDEV_PC_PERRMASK: 1084484Sbinkertn@umich.edu panic("PC_PERRMASK not implemented\n"); 1094484Sbinkertn@umich.edu case TSDEV_PC_PERRSET: 1104484Sbinkertn@umich.edu panic("PC_PERRSET not implemented\n"); 1114484Sbinkertn@umich.edu case TSDEV_PC_TLBIV: 1124484Sbinkertn@umich.edu panic("PC_TLBIV not implemented\n"); 1134484Sbinkertn@umich.edu case TSDEV_PC_TLBIA: 1144484Sbinkertn@umich.edu *(uint64_t*)data = 0x00; // shouldn't be readable, but linux 1154484Sbinkertn@umich.edu return No_Fault; 1164484Sbinkertn@umich.edu case TSDEV_PC_PMONCTL: 1174484Sbinkertn@umich.edu panic("PC_PMONCTL not implemented\n"); 1184484Sbinkertn@umich.edu case TSDEV_PC_PMONCNT: 1194484Sbinkertn@umich.edu panic("PC_PMONCTN not implemented\n"); 1204484Sbinkertn@umich.edu default: 1214484Sbinkertn@umich.edu panic("Default in PChip Read reached reading 0x%x\n", daddr); 1224484Sbinkertn@umich.edu 1234484Sbinkertn@umich.edu } // uint64_t 1244484Sbinkertn@umich.edu 1254484Sbinkertn@umich.edu break; 1264484Sbinkertn@umich.edu case sizeof(uint32_t): 1274484Sbinkertn@umich.edu case sizeof(uint16_t): 1284484Sbinkertn@umich.edu case sizeof(uint8_t): 1294484Sbinkertn@umich.edu default: 1304484Sbinkertn@umich.edu panic("invalid access size(?) for tsunami register!\n\n"); 1314484Sbinkertn@umich.edu } 1324484Sbinkertn@umich.edu DPRINTFN("Tsunami PChip ERROR: read daddr=%#x size=%d\n", daddr, req->size); 1334484Sbinkertn@umich.edu 1344484Sbinkertn@umich.edu return No_Fault; 1354484Sbinkertn@umich.edu} 1364484Sbinkertn@umich.edu 1374484Sbinkertn@umich.eduFault 1384484Sbinkertn@umich.eduTsunamiPChip::write(MemReqPtr req, const uint8_t *data) 1394484Sbinkertn@umich.edu{ 1404484Sbinkertn@umich.edu DPRINTF(Tsunami, "write - va=%#x size=%d \n", 1414484Sbinkertn@umich.edu req->vaddr, req->size); 1424484Sbinkertn@umich.edu 1434484Sbinkertn@umich.edu Addr daddr = (req->paddr & addr_mask) >> 6; 1444484Sbinkertn@umich.edu 1454484Sbinkertn@umich.edu switch (req->size) { 1464484Sbinkertn@umich.edu 1474484Sbinkertn@umich.edu case sizeof(uint64_t): 1484484Sbinkertn@umich.edu switch(daddr) { 1494484Sbinkertn@umich.edu case TSDEV_PC_WSBA0: 1504484Sbinkertn@umich.edu wsba0 = *(uint64_t*)data; 1514484Sbinkertn@umich.edu return No_Fault; 152 case TSDEV_PC_WSBA1: 153 wsba1 = *(uint64_t*)data; 154 return No_Fault; 155 case TSDEV_PC_WSBA2: 156 wsba2 = *(uint64_t*)data; 157 return No_Fault; 158 case TSDEV_PC_WSBA3: 159 wsba3 = *(uint64_t*)data; 160 return No_Fault; 161 case TSDEV_PC_WSM0: 162 wsm0 = *(uint64_t*)data; 163 return No_Fault; 164 case TSDEV_PC_WSM1: 165 wsm1 = *(uint64_t*)data; 166 return No_Fault; 167 case TSDEV_PC_WSM2: 168 wsm2 = *(uint64_t*)data; 169 return No_Fault; 170 case TSDEV_PC_WSM3: 171 wsm3 = *(uint64_t*)data; 172 return No_Fault; 173 case TSDEV_PC_TBA0: 174 tba0 = *(uint64_t*)data; 175 return No_Fault; 176 case TSDEV_PC_TBA1: 177 tba1 = *(uint64_t*)data; 178 return No_Fault; 179 case TSDEV_PC_TBA2: 180 tba2 = *(uint64_t*)data; 181 return No_Fault; 182 case TSDEV_PC_TBA3: 183 tba3 = *(uint64_t*)data; 184 return No_Fault; 185 case TSDEV_PC_PCTL: 186 // might want to change the clock?? 187 //*(uint64_t*)data; // try this 188 return No_Fault; 189 case TSDEV_PC_PLAT: 190 panic("PC_PLAT not implemented\n"); 191 case TSDEV_PC_RES: 192 panic("PC_RES not implemented\n"); 193 case TSDEV_PC_PERROR: 194 panic("PC_PERROR not implemented\n"); 195 case TSDEV_PC_PERRMASK: 196 panic("PC_PERRMASK not implemented\n"); 197 case TSDEV_PC_PERRSET: 198 panic("PC_PERRSET not implemented\n"); 199 case TSDEV_PC_TLBIV: 200 panic("PC_TLBIV not implemented\n"); 201 case TSDEV_PC_TLBIA: 202 return No_Fault; // value ignored, supposted to invalidate SG TLB 203 case TSDEV_PC_PMONCTL: 204 panic("PC_PMONCTL not implemented\n"); 205 case TSDEV_PC_PMONCNT: 206 panic("PC_PMONCTN not implemented\n"); 207 default: 208 panic("Default in PChip Read reached reading 0x%x\n", daddr); 209 210 } // uint64_t 211 212 break; 213 case sizeof(uint32_t): 214 case sizeof(uint16_t): 215 case sizeof(uint8_t): 216 default: 217 panic("invalid access size(?) for tsunami register!\n\n"); 218 } 219 220 DPRINTFN("Tsunami ERROR: write daddr=%#x size=%d\n", daddr, req->size); 221 222 return No_Fault; 223} 224 225void 226TsunamiPChip::serialize(std::ostream &os) 227{ 228 // code should be written 229} 230 231void 232TsunamiPChip::unserialize(Checkpoint *cp, const std::string §ion) 233{ 234 //code should be written 235} 236 237BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiPChip) 238 239 SimObjectParam<Tsunami *> tsunami; 240 SimObjectParam<MemoryController *> mmu; 241 Param<Addr> addr; 242 Param<Addr> mask; 243 244END_DECLARE_SIM_OBJECT_PARAMS(TsunamiPChip) 245 246BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiPChip) 247 248 INIT_PARAM(tsunami, "Tsunami"), 249 INIT_PARAM(mmu, "Memory Controller"), 250 INIT_PARAM(addr, "Device Address"), 251 INIT_PARAM(mask, "Address Mask") 252 253END_INIT_SIM_OBJECT_PARAMS(TsunamiPChip) 254 255CREATE_SIM_OBJECT(TsunamiPChip) 256{ 257 return new TsunamiPChip(getInstanceName(), tsunami, addr, mask, mmu); 258} 259 260REGISTER_SIM_OBJECT("TsunamiPChip", TsunamiPChip) 261