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 &section)
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