ffde4da98890d195aa16295d30550c56e95854d0
4 * Tsunami CChip (processor, memory, or IO)
11 #include "base/trace.hh"
12 #include "cpu/exec_context.hh"
13 #include "dev/console.hh"
14 #include "dev/etherdev.hh"
15 #include "dev/scsi_ctrl.hh"
16 #include "dev/tlaser_clock.hh"
17 #include "dev/tsunami_cchip.hh"
18 #include "dev/tsunamireg.h"
19 #include "dev/tsunami.hh"
20 #include "cpu/intr_control.hh"
21 #include "mem/functional_mem/memory_control.hh"
22 #include "sim/builder.hh"
23 #include "sim/system.hh"
27 TsunamiCChip::TsunamiCChip(const string
&name
, Tsunami
*t
,
28 Addr addr
, Addr mask
, MemoryController
*mmu
)
29 : MmapDevice(name
, addr
, mask
, mmu
), tsunami(t
)
31 for(int i
=0; i
< Tsunami::Max_CPUs
; i
++) {
38 RTCInterrupting
= false;
40 //Put back pointer in tsunami
41 tsunami
->cchip
= this;
45 TsunamiCChip::read(MemReqPtr req
, uint8_t *data
)
47 DPRINTF(Tsunami
, "read va=%#x size=%d\n",
48 req
->vaddr
, req
->size
);
50 Addr daddr
= (req
->paddr
& addr_mask
) >> 6;
51 // ExecContext *xc = req->xc;
52 // int cpuid = xc->cpu_id;
56 case sizeof(uint64_t):
59 *(uint64_t*)data
= 0x0;
62 panic("TSDEV_CC_MTR not implemeted\n");
65 *(uint64_t*)data
= misc
;
71 panic("TSDEV_CC_AARx not implemeted\n");
74 *(uint64_t*)data
= dim
[0];
77 *(uint64_t*)data
= dim
[1];
80 *(uint64_t*)data
= dim
[2];
83 *(uint64_t*)data
= dim
[3];
86 *(uint64_t*)data
= dir
[0];
89 *(uint64_t*)data
= dir
[1];
92 *(uint64_t*)data
= dir
[2];
95 *(uint64_t*)data
= dir
[3];
98 *(uint64_t*)data
= drir
;
101 panic("TSDEV_CC_PRBEN not implemented\n");
107 panic("TSDEV_CC_IICx not implemented\n");
113 panic("TSDEV_CC_MPRx not implemented\n");
116 panic("default in cchip read reached, accessing 0x%x\n");
120 case sizeof(uint32_t):
121 case sizeof(uint16_t):
122 case sizeof(uint8_t):
124 panic("invalid access size(?) for tsunami register!\n");
126 DPRINTFN("Tsunami CChip ERROR: read daddr=%#x size=%d\n", daddr
, req
->size
);
132 TsunamiCChip::write(MemReqPtr req
, const uint8_t *data
)
134 DPRINTF(Tsunami
, "write - va=%#x size=%d \n",
135 req
->vaddr
, req
->size
);
137 Addr daddr
= (req
->paddr
& addr_mask
) >> 6;
141 case sizeof(uint64_t):
144 panic("TSDEV_CC_CSR write\n");
147 panic("TSDEV_CC_MTR write not implemented\n");
150 //If it is the seventh bit, clear the RTC interrupt
151 if ((*(uint64_t*) data
) & (1<<4)) {
152 RTCInterrupting
= false;
153 tsunami
->intrctrl
->clear(0, TheISA::INTLEVEL_IRQ2
, 0);
154 DPRINTF(Tsunami
, "clearing rtc interrupt\n");
156 } else panic("TSDEV_CC_MISC write not implemented\n");
162 panic("TSDEV_CC_AARx write not implemeted\n");
165 dim
[0] = *(uint64_t*)data
;
168 dim
[1] = *(uint64_t*)data
;
171 dim
[2] = *(uint64_t*)data
;
174 dim
[3] = *(uint64_t*)data
;
180 panic("TSDEV_CC_DIR write not implemented\n");
183 panic("TSDEV_CC_DRIR write not implemented\n");
186 panic("TSDEV_CC_PRBEN write not implemented\n");
192 panic("TSDEV_CC_IICx write not implemented\n");
198 panic("TSDEV_CC_MPRx write not implemented\n");
201 panic("default in cchip read reached, accessing 0x%x\n");
205 case sizeof(uint32_t):
206 case sizeof(uint16_t):
207 case sizeof(uint8_t):
209 panic("invalid access size(?) for tsunami register!\n");
212 DPRINTFN("Tsunami ERROR: write daddr=%#x size=%d\n", daddr
, req
->size
);
218 TsunamiCChip::serialize(std::ostream
&os
)
220 // code should be written
224 TsunamiCChip::unserialize(Checkpoint
*cp
, const std::string
§ion
)
226 //code should be written
229 BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiCChip
)
231 SimObjectParam
<Tsunami
*> tsunami
;
232 SimObjectParam
<MemoryController
*> mmu
;
236 END_DECLARE_SIM_OBJECT_PARAMS(TsunamiCChip
)
238 BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiCChip
)
240 INIT_PARAM(tsunami
, "Tsunami"),
241 INIT_PARAM(mmu
, "Memory Controller"),
242 INIT_PARAM(addr
, "Device Address"),
243 INIT_PARAM(mask
, "Address Mask")
245 END_INIT_SIM_OBJECT_PARAMS(TsunamiCChip
)
247 CREATE_SIM_OBJECT(TsunamiCChip
)
249 return new TsunamiCChip(getInstanceName(), tsunami
, addr
, mask
, mmu
);
252 REGISTER_SIM_OBJECT("TsunamiCChip", TsunamiCChip
)