/* $Id$ */ /* @file * Tsunami PChip (pci) */ #include #include #include #include "base/trace.hh" #include "cpu/exec_context.hh" #include "dev/console.hh" #include "dev/etherdev.hh" #include "dev/scsi_ctrl.hh" #include "dev/tlaser_clock.hh" #include "dev/tsunami_pchip.hh" #include "dev/tsunamireg.h" #include "dev/tsunami.hh" #include "mem/functional_mem/memory_control.hh" #include "sim/builder.hh" #include "sim/system.hh" using namespace std; TsunamiPChip::TsunamiPChip(const string &name, /*Tsunami *t,*/ Addr addr, Addr mask, MemoryController *mmu) : MmapDevice(name, addr, mask, mmu)/*, tsunami(t) */ { wsba0 = 0; wsba1 = 0; wsba2 = 0; wsba3 = 0; wsm0 = 0; wsm1 = 0; wsm2 = 0; wsm3 = 0; tba0 = 0; tba1 = 0; tba2 = 0; tba3 = 0; } Fault TsunamiPChip::read(MemReqPtr req, uint8_t *data) { DPRINTF(Tsunami, "read va=%#x size=%d\n", req->vaddr, req->size); Addr daddr = (req->paddr & addr_mask) >> 6; // ExecContext *xc = req->xc; // int cpuid = xc->cpu_id; switch (req->size) { case sizeof(uint64_t): switch(daddr) { case TSDEV_PC_WSBA0: *(uint64_t*)data = wsba0; return No_Fault; case TSDEV_PC_WSBA1: *(uint64_t*)data = wsba1; return No_Fault; case TSDEV_PC_WSBA2: *(uint64_t*)data = wsba2; return No_Fault; case TSDEV_PC_WSBA3: *(uint64_t*)data = wsba3; return No_Fault; case TSDEV_PC_WSM0: *(uint64_t*)data = wsm0; return No_Fault; case TSDEV_PC_WSM1: *(uint64_t*)data = wsm1; return No_Fault; case TSDEV_PC_WSM2: *(uint64_t*)data = wsm2; return No_Fault; case TSDEV_PC_WSM3: *(uint64_t*)data = wsm3; return No_Fault; case TSDEV_PC_TBA0: *(uint64_t*)data = tba0; return No_Fault; case TSDEV_PC_TBA1: *(uint64_t*)data = tba1; return No_Fault; case TSDEV_PC_TBA2: *(uint64_t*)data = tba2; return No_Fault; case TSDEV_PC_TBA3: *(uint64_t*)data = tba3; return No_Fault; case TSDEV_PC_PCTL: // might want to change the clock?? *(uint64_t*)data = 0x00; // try this return No_Fault; case TSDEV_PC_PLAT: panic("PC_PLAT not implemented\n"); case TSDEV_PC_RES: panic("PC_RES not implemented\n"); case TSDEV_PC_PERROR: panic("PC_PERROR not implemented\n"); case TSDEV_PC_PERRMASK: panic("PC_PERRMASK not implemented\n"); case TSDEV_PC_PERRSET: panic("PC_PERRSET not implemented\n"); case TSDEV_PC_TLBIV: panic("PC_TLBIV not implemented\n"); case TSDEV_PC_TLBIA: *(uint64_t*)data = 0x00; // shouldn't be readable, but linux return No_Fault; case TSDEV_PC_PMONCTL: panic("PC_PMONCTL not implemented\n"); case TSDEV_PC_PMONCNT: panic("PC_PMONCTN not implemented\n"); default: panic("Default in PChip Read reached reading 0x%x\n", daddr); } // uint64_t break; case sizeof(uint32_t): case sizeof(uint16_t): case sizeof(uint8_t): default: panic("invalid access size(?) for tsunami register!\n\n"); } DPRINTFN("Tsunami PChip ERROR: read daddr=%#x size=%d\n", daddr, req->size); return No_Fault; } Fault TsunamiPChip::write(MemReqPtr req, const uint8_t *data) { DPRINTF(Tsunami, "write - va=%#x size=%d \n", req->vaddr, req->size); Addr daddr = (req->paddr & addr_mask) >> 6; switch (req->size) { case sizeof(uint64_t): switch(daddr) { case TSDEV_PC_WSBA0: wsba0 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_WSBA1: wsba1 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_WSBA2: wsba2 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_WSBA3: wsba3 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_WSM0: wsm0 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_WSM1: wsm1 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_WSM2: wsm2 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_WSM3: wsm3 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_TBA0: tba0 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_TBA1: tba1 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_TBA2: tba2 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_TBA3: tba3 = *(uint64_t*)data; return No_Fault; case TSDEV_PC_PCTL: // might want to change the clock?? //*(uint64_t*)data; // try this return No_Fault; case TSDEV_PC_PLAT: panic("PC_PLAT not implemented\n"); case TSDEV_PC_RES: panic("PC_RES not implemented\n"); case TSDEV_PC_PERROR: panic("PC_PERROR not implemented\n"); case TSDEV_PC_PERRMASK: panic("PC_PERRMASK not implemented\n"); case TSDEV_PC_PERRSET: panic("PC_PERRSET not implemented\n"); case TSDEV_PC_TLBIV: panic("PC_TLBIV not implemented\n"); case TSDEV_PC_TLBIA: return No_Fault; // value ignored, supposted to invalidate SG TLB case TSDEV_PC_PMONCTL: panic("PC_PMONCTL not implemented\n"); case TSDEV_PC_PMONCNT: panic("PC_PMONCTN not implemented\n"); default: panic("Default in PChip Read reached reading 0x%x\n", daddr); } // uint64_t break; case sizeof(uint32_t): case sizeof(uint16_t): case sizeof(uint8_t): default: panic("invalid access size(?) for tsunami register!\n\n"); } DPRINTFN("Tsunami ERROR: write daddr=%#x size=%d\n", daddr, req->size); return No_Fault; } void TsunamiPChip::serialize(std::ostream &os) { // code should be written } void TsunamiPChip::unserialize(Checkpoint *cp, const std::string §ion) { //code should be written } BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiPChip) /* SimObjectParam tsunami;*/ SimObjectParam mmu; Param addr; Param mask; END_DECLARE_SIM_OBJECT_PARAMS(TsunamiPChip) BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiPChip) /*INIT_PARAM(tsunami, "Tsunami"),*/ INIT_PARAM(mmu, "Memory Controller"), INIT_PARAM(addr, "Device Address"), INIT_PARAM(mask, "Address Mask") END_INIT_SIM_OBJECT_PARAMS(TsunamiPChip) CREATE_SIM_OBJECT(TsunamiPChip) { return new TsunamiPChip(getInstanceName(), /*tsunami,*/ addr, mask, mmu); } REGISTER_SIM_OBJECT("TsunamiPChip", TsunamiPChip)