Lines Matching refs:hw_its

54     struct host_its *hw_its;  member
70 static int its_send_command(struct host_its *hw_its, const void *its_cmd) in its_send_command() argument
90 spin_lock(&hw_its->cmd_lock); in its_send_command()
93 readp = readq_relaxed(hw_its->its_base + GITS_CREADR) & BUFPTR_MASK; in its_send_command()
94 writep = readq_relaxed(hw_its->its_base + GITS_CWRITER) & BUFPTR_MASK; in its_send_command()
106 spin_unlock(&hw_its->cmd_lock); in its_send_command()
109 spin_lock(&hw_its->cmd_lock); in its_send_command()
114 spin_unlock(&hw_its->cmd_lock); in its_send_command()
120 memcpy(hw_its->cmd_buf + writep, its_cmd, ITS_CMD_SIZE); in its_send_command()
121 if ( hw_its->flags & HOST_ITS_FLUSH_CMD_QUEUE ) in its_send_command()
122 clean_and_invalidate_dcache_va_range(hw_its->cmd_buf + writep, in its_send_command()
128 writeq_relaxed(writep & BUFPTR_MASK, hw_its->its_base + GITS_CWRITER); in its_send_command()
130 spin_unlock(&hw_its->cmd_lock); in its_send_command()
136 static int gicv3_its_wait_commands(struct host_its *hw_its) in gicv3_its_wait_commands() argument
148 spin_lock(&hw_its->cmd_lock); in gicv3_its_wait_commands()
149 readp = readq_relaxed(hw_its->its_base + GITS_CREADR) & BUFPTR_MASK; in gicv3_its_wait_commands()
150 writep = readq_relaxed(hw_its->its_base + GITS_CWRITER) & BUFPTR_MASK; in gicv3_its_wait_commands()
151 spin_unlock(&hw_its->cmd_lock); in gicv3_its_wait_commands()
163 static uint64_t encode_rdbase(struct host_its *hw_its, unsigned int cpu, in encode_rdbase() argument
168 reg |= gicv3_get_redist_address(cpu, hw_its->flags & HOST_ITS_USES_PTA); in encode_rdbase()
424 static int gicv3_disable_its(struct host_its *hw_its) in gicv3_disable_its() argument
433 reg = readl_relaxed(hw_its->its_base + GITS_CTLR); in gicv3_disable_its()
437 writel_relaxed(reg & ~GITS_CTLR_ENABLE, hw_its->its_base + GITS_CTLR); in gicv3_disable_its()
440 reg = readl_relaxed(hw_its->its_base + GITS_CTLR); in gicv3_disable_its()
448 printk(XENLOG_ERR "ITS@%lx not quiescent.\n", hw_its->addr); in gicv3_disable_its()
453 static int gicv3_its_init_single_its(struct host_its *hw_its) in gicv3_its_init_single_its() argument
458 hw_its->its_base = ioremap_nocache(hw_its->addr, hw_its->size); in gicv3_its_init_single_its()
459 if ( !hw_its->its_base ) in gicv3_its_init_single_its()
462 ret = gicv3_disable_its(hw_its); in gicv3_its_init_single_its()
466 reg = readq_relaxed(hw_its->its_base + GITS_TYPER); in gicv3_its_init_single_its()
467 hw_its->devid_bits = GITS_TYPER_DEVICE_ID_BITS(reg); in gicv3_its_init_single_its()
468 hw_its->evid_bits = GITS_TYPER_EVENT_ID_BITS(reg); in gicv3_its_init_single_its()
469 hw_its->itte_size = GITS_TYPER_ITT_SIZE(reg); in gicv3_its_init_single_its()
471 hw_its->flags |= HOST_ITS_USES_PTA; in gicv3_its_init_single_its()
472 spin_lock_init(&hw_its->cmd_lock); in gicv3_its_init_single_its()
476 void __iomem *basereg = hw_its->its_base + GITS_BASER0 + i * 8; in gicv3_its_init_single_its()
486 ret = its_map_baser(basereg, reg, BIT(hw_its->devid_bits)); in gicv3_its_init_single_its()
506 hw_its->cmd_buf = its_map_cbaser(hw_its); in gicv3_its_init_single_its()
507 if ( !hw_its->cmd_buf ) in gicv3_its_init_single_its()
509 writeq_relaxed(0, hw_its->its_base + GITS_CWRITER); in gicv3_its_init_single_its()
512 reg = readl_relaxed(hw_its->its_base + GITS_CTLR); in gicv3_its_init_single_its()
513 writel_relaxed(reg | GITS_CTLR_ENABLE, hw_its->its_base + GITS_CTLR); in gicv3_its_init_single_its()
520 struct host_its *hw_its; in gicv3_its_init() local
523 list_for_each_entry(hw_its, &host_its_list, entry) in gicv3_its_init()
525 ret = gicv3_its_init_single_its(hw_its); in gicv3_its_init()
542 if ( dev->hw_its ) in remove_mapped_guest_device()
544 ret = its_send_cmd_mapd(dev->hw_its, dev->host_devid, 0, 0, false); in remove_mapped_guest_device()
551 ret = gicv3_its_wait_commands(dev->hw_its); in remove_mapped_guest_device()
568 struct host_its *hw_its; in gicv3_its_find_by_doorbell() local
570 list_for_each_entry(hw_its, &host_its_list, entry) in gicv3_its_find_by_doorbell()
572 if ( hw_its->addr + ITS_DOORBELL_OFFSET == doorbell_address ) in gicv3_its_find_by_doorbell()
573 return hw_its; in gicv3_its_find_by_doorbell()
643 struct host_its *hw_its; in gicv3_its_map_guest_device() local
648 hw_its = gicv3_its_find_by_doorbell(host_doorbell); in gicv3_its_map_guest_device()
649 if ( !hw_its ) in gicv3_its_map_guest_device()
653 if ( host_devid >= BIT(hw_its->devid_bits) ) in gicv3_its_map_guest_device()
666 if ( nr_events >= BIT(hw_its->evid_bits) ) in gicv3_its_map_guest_device()
709 itt_addr = _xzalloc(nr_events * hw_its->itte_size, 256); in gicv3_its_map_guest_device()
737 ret = its_send_cmd_mapd(hw_its, host_devid, fls(nr_events - 1), in gicv3_its_map_guest_device()
743 dev->hw_its = hw_its; in gicv3_its_map_guest_device()
764 ret = gicv3_its_map_host_events(hw_its, host_devid, i * LPI_BLOCK, in gicv3_its_map_guest_device()
784 its_send_cmd_mapd(hw_its, host_devid, 0, 0, false); in gicv3_its_map_guest_device()