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