Skip to content

Commit 2ab8560

Browse files
committed
fixes address decoding of CLIC to match RTL
1 parent 98b0280 commit 2ab8560

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

src/iss/mem/clic.h

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,16 @@ template <typename WORD_TYPE> struct clic : public memory_elem {
145145
iss::status read_mem(addr_t const& addr, unsigned length, uint8_t* data) {
146146
auto end_addr = addr.val - 1 + length;
147147
if(addr.space == 0 && addr.val <= end_addr && addr.val >= cfg.clic_base && end_addr <= (cfg.clic_base + 0x7fff))
148-
return read_clic(addr.val, length, data);
148+
if( read_clic(addr.val, length, data) ==iss::Ok)
149+
return iss::Ok;
149150
return down_stream_mem.rd_mem(addr, length, data);
150151
}
151152

152153
iss::status write_mem(addr_t const& addr, unsigned length, uint8_t const* data) {
153154
auto end_addr = addr.val - 1 + length;
154155
if(addr.space == 0 && addr.val <= end_addr && addr.val >= cfg.clic_base && end_addr <= (cfg.clic_base + 0x7fff))
155-
return write_clic(addr.val, length, data);
156+
if( write_clic(addr.val, length, data) ==iss::Ok)
157+
return iss::Ok;
156158
return down_stream_mem.wr_mem(addr, length, data);
157159
}
158160

@@ -261,33 +263,40 @@ template <typename WORD_TYPE> iss::status clic<WORD_TYPE>::read_clic(uint64_t ad
261263
*data = clic_cfg_reg;
262264
for(auto i = 1; i < length; ++i)
263265
*(data + i) = 0;
266+
return iss::Ok;
267+
#if 0
264268
} else if(addr >= (cfg.clic_base + 0x40) && (addr + length) <= (cfg.clic_base + 0x40 + cfg.clic_num_trigger * 4)) { // clicinttrig
265269
auto offset = ((addr & 0x7fff) - 0x40) / 4;
266270
read_reg_with_offset(clic_inttrig_reg[offset], addr & 0x3, data, length);
271+
return iss::Ok;
272+
#endif
267273
} else if(addr >= (cfg.clic_base + 0x1000) &&
268274
(addr + length) <= (cfg.clic_base + 0x1000 + cfg.clic_num_irq * 4)) { // clicintip/clicintie/clicintattr/clicintctl
269275
auto offset = ((addr & 0x7fff) - 0x1000) / 4;
270276
read_reg_with_offset(clic_int_reg[offset].raw, addr & 0x3, data, length);
271-
} else {
272-
for(auto i = 0U; i < length; ++i)
273-
*(data + i) = 0;
277+
return iss::Ok;
274278
}
275-
return iss::Ok;
279+
return iss::NotSupported;
276280
}
277281

278282
template <typename WORD_TYPE> iss::status clic<WORD_TYPE>::write_clic(uint64_t addr, unsigned length, const uint8_t* const data) {
279283
if(addr == cfg.clic_base) { // cliccfg
280284
clic_cfg_reg = (clic_cfg_reg & ~0x1e) | (*data & 0x1e);
285+
return iss::Ok;
286+
#if 0
281287
} else if(addr >= (cfg.clic_base + 0x40) && (addr + length) <= (cfg.clic_base + 0x40 + cfg.clic_num_trigger * 4)) { // clicinttrig
282288
auto offset = ((addr & 0x7fff) - 0x40) / 4;
283289
write_reg_with_offset(clic_inttrig_reg[offset], addr & 0x3, data, length);
290+
return iss::Ok;
291+
#endif
284292
} else if(addr >= (cfg.clic_base + 0x1000) &&
285293
(addr + length) <= (cfg.clic_base + 0x1000 + cfg.clic_num_irq * 4)) { // clicintip/clicintie/clicintattr/clicintctl
286294
auto offset = ((addr & 0x7fff) - 0x1000) / 4;
287295
write_reg_with_offset(clic_int_reg[offset].raw, addr & 0x3, data, length);
288296
clic_int_reg[offset].raw &= 0xf0c70101; // clicIntCtlBits->0xf0, clicintattr->0xc7, clicintie->0x1, clicintip->0x1
297+
return iss::Ok;
289298
}
290-
return iss::Ok;
299+
return iss::NotSupported;
291300
}
292301

293302
} // namespace mem

0 commit comments

Comments
 (0)