tsunami_cchip.cc revision 777
12SN/A/* $Id$ */ 29448SAndreas.Sandberg@ARM.com 39920Syasuko.eckert@amd.com/* @file 48733Sgeoffrey.blake@arm.com * Tsunami CChip (processor, memory, or IO) 58733Sgeoffrey.blake@arm.com */ 68733Sgeoffrey.blake@arm.com 78733Sgeoffrey.blake@arm.com#include <deque> 88733Sgeoffrey.blake@arm.com#include <string> 98733Sgeoffrey.blake@arm.com#include <vector> 108733Sgeoffrey.blake@arm.com 118733Sgeoffrey.blake@arm.com#include "base/trace.hh" 128733Sgeoffrey.blake@arm.com#include "cpu/exec_context.hh" 138733Sgeoffrey.blake@arm.com#include "dev/console.hh" 148733Sgeoffrey.blake@arm.com#include "dev/etherdev.hh" 151762SN/A#include "dev/scsi_ctrl.hh" 162SN/A#include "dev/tlaser_clock.hh" 172SN/A#include "dev/tsunami_cchip.hh" 182SN/A#include "dev/tsunamireg.h" 192SN/A#include "dev/tsunami.hh" 202SN/A#include "cpu/intr_control.hh" 212SN/A#include "mem/functional_mem/memory_control.hh" 222SN/A#include "sim/builder.hh" 232SN/A#include "sim/system.hh" 242SN/A 252SN/Ausing namespace std; 262SN/A 272SN/ATsunamiCChip::TsunamiCChip(const string &name, Tsunami *t, 282SN/A Addr addr, Addr mask, MemoryController *mmu) 292SN/A : MmapDevice(name, addr, mask, mmu), tsunami(t) 302SN/A{ 312SN/A for(int i=0; i < Tsunami::Max_CPUs; i++) { 322SN/A dim[i] = 0; 332SN/A dir[i] = 0; 342SN/A dirInterrupting[i] = false; 352SN/A } 362SN/A 372SN/A drir = 0; 382SN/A misc = 0; 392SN/A RTCInterrupting = false; 402665Ssaidi@eecs.umich.edu 412665Ssaidi@eecs.umich.edu //Put back pointer in tsunami 422665Ssaidi@eecs.umich.edu tsunami->cchip = this; 432665Ssaidi@eecs.umich.edu} 442SN/A 452SN/AFault 462623SN/ATsunamiCChip::read(MemReqPtr req, uint8_t *data) 472623SN/A{ 482SN/A DPRINTF(Tsunami, "read va=%#x size=%d\n", 491354SN/A req->vaddr, req->size); 506658Snate@binkert.org 511717SN/A Addr daddr = (req->paddr & addr_mask) >> 6; 528887Sgeoffrey.blake@arm.com// ExecContext *xc = req->xc; 538229Snate@binkert.org// int cpuid = xc->cpu_id; 542683Sktlim@umich.edu 551354SN/A switch (req->size) { 562387SN/A 572387SN/A case sizeof(uint64_t): 582387SN/A switch(daddr) { 5956SN/A case TSDEV_CC_CSR: 608779Sgblack@eecs.umich.edu *(uint64_t*)data = 0x0; 615348Ssaidi@eecs.umich.edu return No_Fault; 622SN/A case TSDEV_CC_MTR: 632SN/A panic("TSDEV_CC_MTR not implemeted\n"); 648779Sgblack@eecs.umich.edu return No_Fault; 658779Sgblack@eecs.umich.edu case TSDEV_CC_MISC: 662SN/A *(uint64_t*)data = misc; 678779Sgblack@eecs.umich.edu return No_Fault; 682SN/A case TSDEV_CC_AAR0: 694182Sgblack@eecs.umich.edu case TSDEV_CC_AAR1: 704182Sgblack@eecs.umich.edu case TSDEV_CC_AAR2: 718779Sgblack@eecs.umich.edu case TSDEV_CC_AAR3: 728779Sgblack@eecs.umich.edu panic("TSDEV_CC_AARx not implemeted\n"); 734182Sgblack@eecs.umich.edu return No_Fault; 742SN/A case TSDEV_CC_DIM0: 752SN/A *(uint64_t*)data = dim[0]; 762SN/A return No_Fault; 772SN/A case TSDEV_CC_DIM1: 782SN/A *(uint64_t*)data = dim[1]; 798737Skoansin.tan@gmail.com return No_Fault; 8010061Sandreas@sandberg.pp.se case TSDEV_CC_DIM2: 812420SN/A *(uint64_t*)data = dim[2]; 822623SN/A return No_Fault; 832SN/A case TSDEV_CC_DIM3: 842107SN/A *(uint64_t*)data = dim[3]; 852159SN/A return No_Fault; 862455SN/A case TSDEV_CC_DIR0: 872455SN/A *(uint64_t*)data = dir[0]; 889920Syasuko.eckert@amd.com return No_Fault; 892386SN/A case TSDEV_CC_DIR1: 9010061Sandreas@sandberg.pp.se *(uint64_t*)data = dir[1]; 9110061Sandreas@sandberg.pp.se return No_Fault; 922623SN/A case TSDEV_CC_DIR2: 932SN/A *(uint64_t*)data = dir[2]; 941371SN/A return No_Fault; 955348Ssaidi@eecs.umich.edu case TSDEV_CC_DIR3: 967720Sgblack@eecs.umich.edu *(uint64_t*)data = dir[3]; 975348Ssaidi@eecs.umich.edu return No_Fault; 987720Sgblack@eecs.umich.edu case TSDEV_CC_DRIR: 995348Ssaidi@eecs.umich.edu *(uint64_t*)data = drir; 1007720Sgblack@eecs.umich.edu return No_Fault; 1017720Sgblack@eecs.umich.edu case TSDEV_CC_PRBEN: 1025348Ssaidi@eecs.umich.edu panic("TSDEV_CC_PRBEN not implemented\n"); 1035348Ssaidi@eecs.umich.edu return No_Fault; 1042SN/A case TSDEV_CC_IIC0: 1055807Snate@binkert.org case TSDEV_CC_IIC1: 1062SN/A case TSDEV_CC_IIC2: 1072SN/A case TSDEV_CC_IIC3: 1082SN/A panic("TSDEV_CC_IICx not implemented\n"); 1092SN/A return No_Fault; 1102SN/A case TSDEV_CC_MPR0: 1112SN/A case TSDEV_CC_MPR1: 1122SN/A case TSDEV_CC_MPR2: 1132SN/A case TSDEV_CC_MPR3: 1142SN/A panic("TSDEV_CC_MPRx not implemented\n"); 1151400SN/A return No_Fault; 1165529Snate@binkert.org default: 1172623SN/A panic("default in cchip read reached, accessing 0x%x\n"); 1182SN/A } // uint64_t 1191400SN/A 1202683Sktlim@umich.edu break; 1212683Sktlim@umich.edu case sizeof(uint32_t): 1222190SN/A case sizeof(uint16_t): 1232683Sktlim@umich.edu case sizeof(uint8_t): 1242683Sktlim@umich.edu default: 1252683Sktlim@umich.edu panic("invalid access size(?) for tsunami register!\n"); 1262680Sktlim@umich.edu } 1278733Sgeoffrey.blake@arm.com DPRINTFN("Tsunami CChip ERROR: read daddr=%#x size=%d\n", daddr, req->size); 1288733Sgeoffrey.blake@arm.com 1298887Sgeoffrey.blake@arm.com return No_Fault; 1305169Ssaidi@eecs.umich.edu} 1315169Ssaidi@eecs.umich.edu 1325496Ssaidi@eecs.umich.eduFault 1335496Ssaidi@eecs.umich.eduTsunamiCChip::write(MemReqPtr req, const uint8_t *data) 1345496Ssaidi@eecs.umich.edu{ 1358276SAli.Saidi@ARM.com DPRINTF(Tsunami, "write - va=%#x size=%d \n", 1365894Sgblack@eecs.umich.edu req->vaddr, req->size); 1375496Ssaidi@eecs.umich.edu 1385496Ssaidi@eecs.umich.edu Addr daddr = (req->paddr & addr_mask) >> 6; 1395496Ssaidi@eecs.umich.edu 1405894Sgblack@eecs.umich.edu switch (req->size) { 1415496Ssaidi@eecs.umich.edu 1425496Ssaidi@eecs.umich.edu case sizeof(uint64_t): 1435496Ssaidi@eecs.umich.edu switch(daddr) { 1445496Ssaidi@eecs.umich.edu case TSDEV_CC_CSR: 1455496Ssaidi@eecs.umich.edu panic("TSDEV_CC_CSR write\n"); 1465496Ssaidi@eecs.umich.edu return No_Fault; 1475496Ssaidi@eecs.umich.edu case TSDEV_CC_MTR: 1485169Ssaidi@eecs.umich.edu panic("TSDEV_CC_MTR write not implemented\n"); 1492SN/A return No_Fault; 1502SN/A case TSDEV_CC_MISC: 1512SN/A //If it is the seventh bit, clear the RTC interrupt 1522SN/A if ((*(uint64_t*) data) & (1<<4)) { 1532SN/A RTCInterrupting = false; 1542SN/A tsunami->intrctrl->clear(0, TheISA::INTLEVEL_IRQ2, 0); 1554181Sgblack@eecs.umich.edu DPRINTF(Tsunami, "clearing rtc interrupt\n"); 1564181Sgblack@eecs.umich.edu misc &= ~(1<<4); 1572107SN/A } else panic("TSDEV_CC_MISC write not implemented\n"); 1583276Sgblack@eecs.umich.edu return No_Fault; 1591469SN/A case TSDEV_CC_AAR0: 1604377Sgblack@eecs.umich.edu case TSDEV_CC_AAR1: 1614377Sgblack@eecs.umich.edu case TSDEV_CC_AAR2: 1624377Sgblack@eecs.umich.edu case TSDEV_CC_AAR3: 1634377Sgblack@eecs.umich.edu panic("TSDEV_CC_AARx write not implemeted\n"); 1644377Sgblack@eecs.umich.edu return No_Fault; 1654377Sgblack@eecs.umich.edu case TSDEV_CC_DIM0: 1662623SN/A dim[0] = *(uint64_t*)data; 1675894Sgblack@eecs.umich.edu if (dim[0] & drir) { 1682623SN/A dir[0] = dim[0] & drir; 1692623SN/A if (!dirInterrupting[0]) { 1702623SN/A dirInterrupting[0] = true; 171180SN/A tsunami->intrctrl->post(0, TheISA::INTLEVEL_IRQ1, 0); 1728737Skoansin.tan@gmail.com DPRINTF(Tsunami, "posting dir interrupt to cpu 0\n"); 1738737Skoansin.tan@gmail.com } 1742SN/A } 1752SN/A return No_Fault; 176334SN/A case TSDEV_CC_DIM1: 177334SN/A dim[1] = *(uint64_t*)data; 1782SN/A if (dim[1] & drir) { 1799461Snilay@cs.wisc.edu dir[1] = dim[1] & drir; 1809461Snilay@cs.wisc.edu if (!dirInterrupting[1]) { 1812SN/A dirInterrupting[1] = true; 1822SN/A tsunami->intrctrl->post(1, TheISA::INTLEVEL_IRQ1, 0); 183334SN/A DPRINTF(Tsunami, "posting dir interrupt to cpu 1\n"); 1845999Snate@binkert.org } 1858834Satgutier@umich.edu } 1868834Satgutier@umich.edu return No_Fault; 1878834Satgutier@umich.edu case TSDEV_CC_DIM2: 188707SN/A dim[2] = *(uint64_t*)data; 1894998Sgblack@eecs.umich.edu if (dim[2] & drir) { 1904998Sgblack@eecs.umich.edu dir[2] = dim[2] & drir; 1918834Satgutier@umich.edu if (!dirInterrupting[2]) { 1928834Satgutier@umich.edu dirInterrupting[2] = true; 1938834Satgutier@umich.edu tsunami->intrctrl->post(2, TheISA::INTLEVEL_IRQ1, 0); 1948834Satgutier@umich.edu DPRINTF(Tsunami, "posting dir interrupt to cpu 2\n"); 1958834Satgutier@umich.edu } 1968834Satgutier@umich.edu } 1978834Satgutier@umich.edu return No_Fault; 1987897Shestness@cs.utexas.edu case TSDEV_CC_DIM3: 1994998Sgblack@eecs.umich.edu dim[3] = *(uint64_t*)data; 2004998Sgblack@eecs.umich.edu if ((dim[3] & drir) /*And Not Already Int*/) { 2014998Sgblack@eecs.umich.edu dir[3] = dim[3] & drir; 2028834Satgutier@umich.edu if (!dirInterrupting[3]) { 203707SN/A dirInterrupting[3] = true; 204707SN/A tsunami->intrctrl->post(3, TheISA::INTLEVEL_IRQ1, 0); 205707SN/A DPRINTF(Tsunami, "posting dir interrupt to cpu 3\n"); 2062SN/A } 2078834Satgutier@umich.edu } 2088834Satgutier@umich.edu return No_Fault; 2098834Satgutier@umich.edu case TSDEV_CC_DIR0: 2108834Satgutier@umich.edu case TSDEV_CC_DIR1: 2118834Satgutier@umich.edu case TSDEV_CC_DIR2: 2127897Shestness@cs.utexas.edu case TSDEV_CC_DIR3: 2137897Shestness@cs.utexas.edu panic("TSDEV_CC_DIR write not implemented\n"); 2147897Shestness@cs.utexas.edu return No_Fault; 2157897Shestness@cs.utexas.edu case TSDEV_CC_DRIR: 2167897Shestness@cs.utexas.edu panic("TSDEV_CC_DRIR write not implemented\n"); 2177897Shestness@cs.utexas.edu return No_Fault; 2187897Shestness@cs.utexas.edu case TSDEV_CC_PRBEN: 2197897Shestness@cs.utexas.edu panic("TSDEV_CC_PRBEN write not implemented\n"); 2207897Shestness@cs.utexas.edu return No_Fault; 2217897Shestness@cs.utexas.edu case TSDEV_CC_IIC0: 2227897Shestness@cs.utexas.edu case TSDEV_CC_IIC1: 2237897Shestness@cs.utexas.edu case TSDEV_CC_IIC2: 2247897Shestness@cs.utexas.edu case TSDEV_CC_IIC3: 2257897Shestness@cs.utexas.edu panic("TSDEV_CC_IICx write not implemented\n"); 2267897Shestness@cs.utexas.edu return No_Fault; 2277897Shestness@cs.utexas.edu case TSDEV_CC_MPR0: 2287897Shestness@cs.utexas.edu case TSDEV_CC_MPR1: 2297897Shestness@cs.utexas.edu case TSDEV_CC_MPR2: 2307897Shestness@cs.utexas.edu case TSDEV_CC_MPR3: 2317897Shestness@cs.utexas.edu panic("TSDEV_CC_MPRx write not implemented\n"); 2327897Shestness@cs.utexas.edu return No_Fault; 2337897Shestness@cs.utexas.edu default: 2347897Shestness@cs.utexas.edu panic("default in cchip read reached, accessing 0x%x\n"); 2357897Shestness@cs.utexas.edu } 2367897Shestness@cs.utexas.edu 2377897Shestness@cs.utexas.edu break; 2389920Syasuko.eckert@amd.com case sizeof(uint32_t): 2399920Syasuko.eckert@amd.com case sizeof(uint16_t): 2409920Syasuko.eckert@amd.com case sizeof(uint8_t): 2419920Syasuko.eckert@amd.com default: 2422SN/A panic("invalid access size(?) for tsunami register!\n"); 2435999Snate@binkert.org } 2447897Shestness@cs.utexas.edu 2457897Shestness@cs.utexas.edu DPRINTFN("Tsunami ERROR: write daddr=%#x size=%d\n", daddr, req->size); 2467897Shestness@cs.utexas.edu 2477897Shestness@cs.utexas.edu return No_Fault; 2487897Shestness@cs.utexas.edu} 2497897Shestness@cs.utexas.edu 2507897Shestness@cs.utexas.eduvoid 2517897Shestness@cs.utexas.eduTsunamiCChip::postDRIR(uint64_t bitvector) 2522SN/A{ 253124SN/A drir |= bitvector; 254124SN/A for(int i=0; i < Tsunami::Max_CPUs; i++) { 255334SN/A if (bitvector & dim[i]) { 256124SN/A dir[i] |= bitvector; 2572SN/A if (!dirInterrupting[i]) { 2585999Snate@binkert.org dirInterrupting[i] = true; 259729SN/A tsunami->intrctrl->post(i, TheISA::INTLEVEL_IRQ1, 0); 2602SN/A DPRINTF(Tsunami, "posting dir interrupt to cpu %d\n",i); 2612390SN/A } 2625999Snate@binkert.org } 2632SN/A } 2642SN/A} 2652390SN/A 2665999Snate@binkert.orgvoid 2672390SN/ATsunamiCChip::clearDRIR(uint64_t bitvector) 2682390SN/A{ 2692390SN/A drir &= ~bitvector; 2705999Snate@binkert.org for(int i=0; i < Tsunami::Max_CPUs; i++) { 2712SN/A dir[i] &= ~bitvector; 2722SN/A if (!dir[i]) { 2732390SN/A dirInterrupting[i] = false; 2745999Snate@binkert.org tsunami->intrctrl->clear(i, TheISA::INTLEVEL_IRQ1, 0); 2752390SN/A DPRINTF(Tsunami, "clearing dir interrupt to cpu %d\n", i); 2762390SN/A 27710061Sandreas@sandberg.pp.se } 27810061Sandreas@sandberg.pp.se } 27910061Sandreas@sandberg.pp.se} 28010061Sandreas@sandberg.pp.se 28110061Sandreas@sandberg.pp.sevoid 28210061Sandreas@sandberg.pp.seTsunamiCChip::serialize(std::ostream &os) 28310061Sandreas@sandberg.pp.se{ 28410061Sandreas@sandberg.pp.se // code should be written 28510061Sandreas@sandberg.pp.se} 28610193SCurtis.Dunham@arm.com 28710193SCurtis.Dunham@arm.comvoid 28810193SCurtis.Dunham@arm.comTsunamiCChip::unserialize(Checkpoint *cp, const std::string §ion) 2899448SAndreas.Sandberg@ARM.com{ 2909448SAndreas.Sandberg@ARM.com //code should be written 2919448SAndreas.Sandberg@ARM.com} 2922SN/A 2931371SN/ABEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiCChip) 2941371SN/A 2952623SN/A SimObjectParam<Tsunami *> tsunami; 2965543Ssaidi@eecs.umich.edu SimObjectParam<MemoryController *> mmu; 2973918Ssaidi@eecs.umich.edu Param<Addr> addr; 2981371SN/A Param<Addr> mask; 299726SN/A 300726SN/AEND_DECLARE_SIM_OBJECT_PARAMS(TsunamiCChip) 301726SN/A 302726SN/ABEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiCChip) 303726SN/A 304726SN/A INIT_PARAM(tsunami, "Tsunami"), 305726SN/A INIT_PARAM(mmu, "Memory Controller"), 306726SN/A INIT_PARAM(addr, "Device Address"), 307726SN/A INIT_PARAM(mask, "Address Mask") 308726SN/A 309705SN/AEND_INIT_SIM_OBJECT_PARAMS(TsunamiCChip) 3103735Sstever@eecs.umich.edu 311726SN/ACREATE_SIM_OBJECT(TsunamiCChip) 3127897Shestness@cs.utexas.edu{ 3132683Sktlim@umich.edu return new TsunamiCChip(getInstanceName(), tsunami, addr, mask, mmu); 314726SN/A} 315705SN/A 3163735Sstever@eecs.umich.eduREGISTER_SIM_OBJECT("TsunamiCChip", TsunamiCChip) 317726SN/A