Lines Matching +full:inter +full:- +full:data
2 * Inter-Thread Communication Unit emulation.
27 #include "hw/qdev-properties.h"
73 return &itu->tag_io; in mips_itu_get_tag_region()
86 return tag->ITCAddressMap[index]; in itc_tag_read()
91 uint64_t *am = &tag->ITCAddressMap[0]; in itc_reconfigure()
92 MemoryRegion *mr = &tag->storage_io; in itc_reconfigure()
98 if (!(size & (size - 1))) { in itc_reconfigure()
107 uint64_t data, unsigned size) in itc_tag_write() argument
110 uint64_t *am = &tag->ITCAddressMap[0]; in itc_tag_write()
127 am[index] = (data & mask) | (am_old & ~mask); in itc_tag_write()
144 return s->num_fifo + s->num_semaphores; in get_num_cells()
155 return 7 + (s->ITCAddressMap[1] & ITC_AM1_ENTRY_GRAIN_MASK); in get_cell_stride_shift()
165 cell_idx = num_cells - 1; in get_cell()
168 return &s->cell[cell_idx]; in get_cell()
175 if (cs->halted && (c->blocked_threads & (1ULL << cs->cpu_index))) { in wake_blocked_threads()
179 c->blocked_threads = 0; in wake_blocked_threads()
185 c->blocked_threads |= 1ULL << current_cpu->cpu_index; in block_thread_and_exit()
186 current_cpu->halted = 1; in block_thread_and_exit()
187 current_cpu->exception_index = EXCP_HLT; in block_thread_and_exit()
188 cpu_loop_exit_restore(current_cpu, current_cpu->mem_io_pc); in block_thread_and_exit()
195 if (c->tag.FIFO) { in view_bypass_read()
196 return c->data[c->fifo_out]; in view_bypass_read()
198 return c->data[0]; in view_bypass_read()
204 if (c->tag.FIFO && (c->tag.FIFOPtr > 0)) { in view_bypass_write()
205 int idx = (c->fifo_out + c->tag.FIFOPtr - 1) % ITC_CELL_DEPTH; in view_bypass_write()
206 c->data[idx] = val; in view_bypass_write()
216 return ((uint64_t)c->tag.FIFODepth << ITC_CELL_TAG_FIFO_DEPTH) | in view_control_read()
217 (c->tag.FIFOPtr << ITC_CELL_TAG_FIFO_PTR) | in view_control_read()
218 (c->tag.FIFO << ITC_CELL_TAG_FIFO) | in view_control_read()
219 (c->tag.T << ITC_CELL_TAG_T) | in view_control_read()
220 (c->tag.E << ITC_CELL_TAG_E) | in view_control_read()
221 (c->tag.F << ITC_CELL_TAG_F); in view_control_read()
226 c->tag.T = (val >> ITC_CELL_TAG_T) & 1; in view_control_write()
227 c->tag.E = (val >> ITC_CELL_TAG_E) & 1; in view_control_write()
228 c->tag.F = (val >> ITC_CELL_TAG_F) & 1; in view_control_write()
230 if (c->tag.E) { in view_control_write()
231 c->tag.FIFOPtr = 0; in view_control_write()
241 if (!c->tag.FIFO) { in view_ef_common_read()
245 c->tag.F = 0; in view_ef_common_read()
247 if (blocking && c->tag.E) { in view_ef_common_read()
251 if (c->blocked_threads) { in view_ef_common_read()
255 if (c->tag.FIFOPtr > 0) { in view_ef_common_read()
256 ret = c->data[c->fifo_out]; in view_ef_common_read()
257 c->fifo_out = (c->fifo_out + 1) % ITC_CELL_DEPTH; in view_ef_common_read()
258 c->tag.FIFOPtr--; in view_ef_common_read()
261 if (c->tag.FIFOPtr == 0) { in view_ef_common_read()
262 c->tag.E = 1; in view_ef_common_read()
281 if (!c->tag.FIFO) { in view_ef_common_write()
285 c->tag.E = 0; in view_ef_common_write()
287 if (blocking && c->tag.F) { in view_ef_common_write()
291 if (c->blocked_threads) { in view_ef_common_write()
295 if (c->tag.FIFOPtr < ITC_CELL_DEPTH) { in view_ef_common_write()
296 int idx = (c->fifo_out + c->tag.FIFOPtr) % ITC_CELL_DEPTH; in view_ef_common_write()
297 c->data[idx] = val; in view_ef_common_write()
298 c->tag.FIFOPtr++; in view_ef_common_write()
301 if (c->tag.FIFOPtr == ITC_CELL_DEPTH) { in view_ef_common_write()
302 c->tag.F = 1; in view_ef_common_write()
320 uint64_t ret = c->data[0]; in view_pv_common_read()
322 if (c->tag.FIFO) { in view_pv_common_read()
326 if (c->data[0] > 0) { in view_pv_common_read()
327 c->data[0]--; in view_pv_common_read()
347 if (c->tag.FIFO) { in view_pv_common_write()
351 if (c->data[0] < ITC_CELL_PV_MAX_VAL) { in view_pv_common_write()
352 c->data[0]++; in view_pv_common_write()
355 if (c->blocked_threads) { in view_pv_common_write()
372 current_cpu->exception_index = excp; in raise_exception()
381 uint64_t ret = -1; in itc_storage_read()
386 s->icr0 |= 1 << ITC_ICR0_ERR_AXI; in itc_storage_read()
411 ret = s->icr0; in itc_storage_read()
422 static void itc_storage_write(void *opaque, hwaddr addr, uint64_t data, in itc_storage_write() argument
432 s->icr0 |= 1 << ITC_ICR0_ERR_AXI; in itc_storage_write()
439 view_bypass_write(cell, data); in itc_storage_write()
442 view_control_write(cell, data); in itc_storage_write()
445 view_ef_sync_write(cell, data); in itc_storage_write()
448 view_ef_try_write(cell, data); in itc_storage_write()
457 if (data & 0x7) { in itc_storage_write()
459 s->icr0 &= ~(data & 0x7); in itc_storage_write()
462 s->icr0 &= ~0x700; in itc_storage_write()
463 s->icr0 |= data & 0x700; in itc_storage_write()
483 memset(s->cell, 0, get_num_cells(s) * sizeof(s->cell[0])); in itc_reset_cells()
485 for (i = 0; i < s->num_fifo; i++) { in itc_reset_cells()
486 s->cell[i].tag.E = 1; in itc_reset_cells()
487 s->cell[i].tag.FIFO = 1; in itc_reset_cells()
488 s->cell[i].tag.FIFODepth = ITC_CELL_DEPTH_SHIFT; in itc_reset_cells()
497 memory_region_init_io(&s->storage_io, OBJECT(s), &itc_storage_ops, s, in mips_itu_init()
498 "mips-itc-storage", ITC_STORAGE_ADDRSPACE_SZ); in mips_itu_init()
499 sysbus_init_mmio(sbd, &s->storage_io); in mips_itu_init()
501 memory_region_init_io(&s->tag_io, OBJECT(s), &itc_tag_ops, s, in mips_itu_init()
502 "mips-itc-tag", ITC_TAG_ADDRSPACE_SZ); in mips_itu_init()
509 if (s->num_fifo > ITC_FIFO_NUM_MAX) { in mips_itu_realize()
511 s->num_fifo); in mips_itu_realize()
514 if (s->num_semaphores > ITC_SEMAPH_NUM_MAX) { in mips_itu_realize()
516 s->num_semaphores); in mips_itu_realize()
520 s->cell = g_new(ITCStorageCell, get_num_cells(s)); in mips_itu_realize()
527 s->ITCAddressMap[0] = 0; in mips_itu_reset()
528 s->ITCAddressMap[1] = in mips_itu_reset()
529 ((ITC_STORAGE_ADDRSPACE_SZ - 1) & ITC_AM1_ADDR_MASK_MASK) | in mips_itu_reset()
537 DEFINE_PROP_UINT32("num-fifo", MIPSITUState, num_fifo,
539 DEFINE_PROP_UINT32("num-semaphores", MIPSITUState, num_semaphores,
543 static void mips_itu_class_init(ObjectClass *klass, const void *data) in mips_itu_class_init() argument
548 dc->realize = mips_itu_realize; in mips_itu_class_init()