• Home
  • Raw
  • Download

Lines Matching refs:its

26 static int vgic_its_save_tables_v0(struct vgic_its *its);
27 static int vgic_its_restore_tables_v0(struct vgic_its *its);
28 static int vgic_its_commit_v0(struct vgic_its *its);
171 int (*save_tables)(struct vgic_its *its);
172 int (*restore_tables)(struct vgic_its *its);
173 int (*commit)(struct vgic_its *its);
192 inline const struct vgic_its_abi *vgic_its_get_abi(struct vgic_its *its) in vgic_its_get_abi() argument
194 return &its_table_abi_versions[its->abi_rev]; in vgic_its_get_abi()
197 static int vgic_its_set_abi(struct vgic_its *its, u32 rev) in vgic_its_set_abi() argument
201 its->abi_rev = rev; in vgic_its_set_abi()
202 abi = vgic_its_get_abi(its); in vgic_its_set_abi()
203 return abi->commit(its); in vgic_its_set_abi()
210 static struct its_device *find_its_device(struct vgic_its *its, u32 device_id) in find_its_device() argument
214 list_for_each_entry(device, &its->device_list, dev_list) in find_its_device()
226 static struct its_ite *find_ite(struct vgic_its *its, u32 device_id, in find_ite() argument
232 device = find_its_device(its, device_id); in find_ite()
244 #define for_each_lpi_its(dev, ite, its) \ argument
245 list_for_each_entry(dev, &(its)->device_list, dev_list) \
259 static struct its_collection *find_collection(struct vgic_its *its, int coll_id) in find_collection() argument
263 list_for_each_entry(collection, &its->collection_list, coll_list) { in find_collection()
402 static void update_affinity_collection(struct kvm *kvm, struct vgic_its *its, in update_affinity_collection() argument
408 for_each_lpi_its(device, ite, its) { in update_affinity_collection()
480 struct vgic_its *its, in vgic_mmio_read_its_typer() argument
483 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in vgic_mmio_read_its_typer()
502 struct vgic_its *its, in vgic_mmio_read_its_iidr() argument
507 val = (its->abi_rev << GITS_IIDR_REV_SHIFT) & GITS_IIDR_REV_MASK; in vgic_mmio_read_its_iidr()
513 struct vgic_its *its, in vgic_mmio_uaccess_write_its_iidr() argument
521 return vgic_its_set_abi(its, rev); in vgic_mmio_uaccess_write_its_iidr()
525 struct vgic_its *its, in vgic_mmio_read_its_idregs() argument
600 static void vgic_its_cache_translation(struct kvm *kvm, struct vgic_its *its, in vgic_its_cache_translation() argument
623 db = its->vgic_its_base + GITS_TRANSLATER; in vgic_its_cache_translation()
676 int vgic_its_resolve_lpi(struct kvm *kvm, struct vgic_its *its, in vgic_its_resolve_lpi() argument
682 if (!its->enabled) in vgic_its_resolve_lpi()
685 ite = find_ite(its, devid, eventid); in vgic_its_resolve_lpi()
696 vgic_its_cache_translation(kvm, its, devid, eventid, ite->irq); in vgic_its_resolve_lpi()
727 return iodev->its; in vgic_msi_to_its()
737 static int vgic_its_trigger_msi(struct kvm *kvm, struct vgic_its *its, in vgic_its_trigger_msi() argument
744 err = vgic_its_resolve_lpi(kvm, its, devid, eventid, &irq); in vgic_its_trigger_msi()
786 struct vgic_its *its; in vgic_its_inject_msi() local
792 its = vgic_msi_to_its(kvm, msi); in vgic_its_inject_msi()
793 if (IS_ERR(its)) in vgic_its_inject_msi()
794 return PTR_ERR(its); in vgic_its_inject_msi()
796 mutex_lock(&its->its_lock); in vgic_its_inject_msi()
797 ret = vgic_its_trigger_msi(kvm, its, msi->devid, msi->data); in vgic_its_inject_msi()
798 mutex_unlock(&its->its_lock); in vgic_its_inject_msi()
849 static int vgic_its_cmd_handle_discard(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_discard() argument
856 ite = find_ite(its, device_id, event_id); in vgic_its_cmd_handle_discard()
876 static int vgic_its_cmd_handle_movi(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_movi() argument
886 ite = find_ite(its, device_id, event_id); in vgic_its_cmd_handle_movi()
893 collection = find_collection(its, coll_id); in vgic_its_cmd_handle_movi()
912 static bool vgic_its_check_id(struct vgic_its *its, u64 baser, u32 id, in vgic_its_check_id() argument
958 if (kvm_read_guest_lock(its->dev->kvm, in vgic_its_check_id()
981 idx = srcu_read_lock(&its->dev->kvm->srcu); in vgic_its_check_id()
982 ret = kvm_is_visible_gfn(its->dev->kvm, gfn); in vgic_its_check_id()
983 srcu_read_unlock(&its->dev->kvm->srcu, idx); in vgic_its_check_id()
987 static int vgic_its_alloc_collection(struct vgic_its *its, in vgic_its_alloc_collection() argument
993 if (!vgic_its_check_id(its, its->baser_coll_table, coll_id, NULL)) in vgic_its_alloc_collection()
1003 list_add_tail(&collection->coll_list, &its->collection_list); in vgic_its_alloc_collection()
1009 static void vgic_its_free_collection(struct vgic_its *its, u32 coll_id) in vgic_its_free_collection() argument
1020 collection = find_collection(its, coll_id); in vgic_its_free_collection()
1024 for_each_lpi_its(device, ite, its) in vgic_its_free_collection()
1055 static int vgic_its_cmd_handle_mapi(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_mapi() argument
1068 device = find_its_device(its, device_id); in vgic_its_cmd_handle_mapi()
1084 if (find_ite(its, device_id, event_id)) in vgic_its_cmd_handle_mapi()
1087 collection = find_collection(its, coll_id); in vgic_its_cmd_handle_mapi()
1089 int ret = vgic_its_alloc_collection(its, &collection, coll_id); in vgic_its_cmd_handle_mapi()
1098 vgic_its_free_collection(its, coll_id); in vgic_its_cmd_handle_mapi()
1108 vgic_its_free_collection(its, coll_id); in vgic_its_cmd_handle_mapi()
1137 static void vgic_its_free_device_list(struct kvm *kvm, struct vgic_its *its) in vgic_its_free_device_list() argument
1141 list_for_each_entry_safe(cur, temp, &its->device_list, dev_list) in vgic_its_free_device_list()
1146 static void vgic_its_free_collection_list(struct kvm *kvm, struct vgic_its *its) in vgic_its_free_collection_list() argument
1150 list_for_each_entry_safe(cur, temp, &its->collection_list, coll_list) in vgic_its_free_collection_list()
1151 vgic_its_free_collection(its, cur->collection_id); in vgic_its_free_collection_list()
1155 static struct its_device *vgic_its_alloc_device(struct vgic_its *its, in vgic_its_alloc_device() argument
1170 list_add_tail(&device->dev_list, &its->device_list); in vgic_its_alloc_device()
1178 static int vgic_its_cmd_handle_mapd(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_mapd() argument
1187 if (!vgic_its_check_id(its, its->baser_device_table, device_id, NULL)) in vgic_its_cmd_handle_mapd()
1193 device = find_its_device(its, device_id); in vgic_its_cmd_handle_mapd()
1210 device = vgic_its_alloc_device(its, device_id, itt_addr, in vgic_its_cmd_handle_mapd()
1220 static int vgic_its_cmd_handle_mapc(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_mapc() argument
1236 vgic_its_free_collection(its, coll_id); in vgic_its_cmd_handle_mapc()
1239 collection = find_collection(its, coll_id); in vgic_its_cmd_handle_mapc()
1244 ret = vgic_its_alloc_collection(its, &collection, in vgic_its_cmd_handle_mapc()
1251 update_affinity_collection(kvm, its, collection); in vgic_its_cmd_handle_mapc()
1262 static int vgic_its_cmd_handle_clear(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_clear() argument
1270 ite = find_ite(its, device_id, event_id); in vgic_its_cmd_handle_clear()
1287 static int vgic_its_cmd_handle_inv(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_inv() argument
1295 ite = find_ite(its, device_id, event_id); in vgic_its_cmd_handle_inv()
1310 static int vgic_its_cmd_handle_invall(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_invall() argument
1320 collection = find_collection(its, coll_id); in vgic_its_cmd_handle_invall()
1354 static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_movall() argument
1398 static int vgic_its_cmd_handle_int(struct kvm *kvm, struct vgic_its *its, in vgic_its_cmd_handle_int() argument
1404 return vgic_its_trigger_msi(kvm, its, msi_devid, msi_data); in vgic_its_cmd_handle_int()
1411 static int vgic_its_handle_command(struct kvm *kvm, struct vgic_its *its, in vgic_its_handle_command() argument
1416 mutex_lock(&its->its_lock); in vgic_its_handle_command()
1419 ret = vgic_its_cmd_handle_mapd(kvm, its, its_cmd); in vgic_its_handle_command()
1422 ret = vgic_its_cmd_handle_mapc(kvm, its, its_cmd); in vgic_its_handle_command()
1425 ret = vgic_its_cmd_handle_mapi(kvm, its, its_cmd); in vgic_its_handle_command()
1428 ret = vgic_its_cmd_handle_mapi(kvm, its, its_cmd); in vgic_its_handle_command()
1431 ret = vgic_its_cmd_handle_movi(kvm, its, its_cmd); in vgic_its_handle_command()
1434 ret = vgic_its_cmd_handle_discard(kvm, its, its_cmd); in vgic_its_handle_command()
1437 ret = vgic_its_cmd_handle_clear(kvm, its, its_cmd); in vgic_its_handle_command()
1440 ret = vgic_its_cmd_handle_movall(kvm, its, its_cmd); in vgic_its_handle_command()
1443 ret = vgic_its_cmd_handle_int(kvm, its, its_cmd); in vgic_its_handle_command()
1446 ret = vgic_its_cmd_handle_inv(kvm, its, its_cmd); in vgic_its_handle_command()
1449 ret = vgic_its_cmd_handle_invall(kvm, its, its_cmd); in vgic_its_handle_command()
1456 mutex_unlock(&its->its_lock); in vgic_its_handle_command()
1498 struct vgic_its *its, in vgic_mmio_read_its_cbaser() argument
1501 return extract_bytes(its->cbaser, addr & 7, len); in vgic_mmio_read_its_cbaser()
1504 static void vgic_mmio_write_its_cbaser(struct kvm *kvm, struct vgic_its *its, in vgic_mmio_write_its_cbaser() argument
1509 if (its->enabled) in vgic_mmio_write_its_cbaser()
1512 mutex_lock(&its->cmd_lock); in vgic_mmio_write_its_cbaser()
1513 its->cbaser = update_64bit_reg(its->cbaser, addr & 7, len, val); in vgic_mmio_write_its_cbaser()
1514 its->cbaser = vgic_sanitise_its_cbaser(its->cbaser); in vgic_mmio_write_its_cbaser()
1515 its->creadr = 0; in vgic_mmio_write_its_cbaser()
1520 its->cwriter = its->creadr; in vgic_mmio_write_its_cbaser()
1521 mutex_unlock(&its->cmd_lock); in vgic_mmio_write_its_cbaser()
1529 static void vgic_its_process_commands(struct kvm *kvm, struct vgic_its *its) in vgic_its_process_commands() argument
1535 if (!its->enabled) in vgic_its_process_commands()
1538 cbaser = GITS_CBASER_ADDRESS(its->cbaser); in vgic_its_process_commands()
1540 while (its->cwriter != its->creadr) { in vgic_its_process_commands()
1541 int ret = kvm_read_guest_lock(kvm, cbaser + its->creadr, in vgic_its_process_commands()
1551 vgic_its_handle_command(kvm, its, cmd_buf); in vgic_its_process_commands()
1553 its->creadr += ITS_CMD_SIZE; in vgic_its_process_commands()
1554 if (its->creadr == ITS_CMD_BUFFER_SIZE(its->cbaser)) in vgic_its_process_commands()
1555 its->creadr = 0; in vgic_its_process_commands()
1565 static void vgic_mmio_write_its_cwriter(struct kvm *kvm, struct vgic_its *its, in vgic_mmio_write_its_cwriter() argument
1571 if (!its) in vgic_mmio_write_its_cwriter()
1574 mutex_lock(&its->cmd_lock); in vgic_mmio_write_its_cwriter()
1576 reg = update_64bit_reg(its->cwriter, addr & 7, len, val); in vgic_mmio_write_its_cwriter()
1578 if (reg >= ITS_CMD_BUFFER_SIZE(its->cbaser)) { in vgic_mmio_write_its_cwriter()
1579 mutex_unlock(&its->cmd_lock); in vgic_mmio_write_its_cwriter()
1582 its->cwriter = reg; in vgic_mmio_write_its_cwriter()
1584 vgic_its_process_commands(kvm, its); in vgic_mmio_write_its_cwriter()
1586 mutex_unlock(&its->cmd_lock); in vgic_mmio_write_its_cwriter()
1590 struct vgic_its *its, in vgic_mmio_read_its_cwriter() argument
1593 return extract_bytes(its->cwriter, addr & 0x7, len); in vgic_mmio_read_its_cwriter()
1597 struct vgic_its *its, in vgic_mmio_read_its_creadr() argument
1600 return extract_bytes(its->creadr, addr & 0x7, len); in vgic_mmio_read_its_creadr()
1604 struct vgic_its *its, in vgic_mmio_uaccess_write_its_creadr() argument
1611 mutex_lock(&its->cmd_lock); in vgic_mmio_uaccess_write_its_creadr()
1613 if (its->enabled) { in vgic_mmio_uaccess_write_its_creadr()
1619 if (cmd_offset >= ITS_CMD_BUFFER_SIZE(its->cbaser)) { in vgic_mmio_uaccess_write_its_creadr()
1624 its->creadr = cmd_offset; in vgic_mmio_uaccess_write_its_creadr()
1626 mutex_unlock(&its->cmd_lock); in vgic_mmio_uaccess_write_its_creadr()
1632 struct vgic_its *its, in vgic_mmio_read_its_baser() argument
1639 reg = its->baser_device_table; in vgic_mmio_read_its_baser()
1642 reg = its->baser_coll_table; in vgic_mmio_read_its_baser()
1654 struct vgic_its *its, in vgic_mmio_write_its_baser() argument
1658 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in vgic_mmio_write_its_baser()
1663 if (its->enabled) in vgic_mmio_write_its_baser()
1668 regptr = &its->baser_device_table; in vgic_mmio_write_its_baser()
1673 regptr = &its->baser_coll_table; in vgic_mmio_write_its_baser()
1694 mutex_lock(&its->its_lock); in vgic_mmio_write_its_baser()
1697 vgic_its_free_device_list(kvm, its); in vgic_mmio_write_its_baser()
1700 vgic_its_free_collection_list(kvm, its); in vgic_mmio_write_its_baser()
1703 mutex_unlock(&its->its_lock); in vgic_mmio_write_its_baser()
1708 struct vgic_its *its, in vgic_mmio_read_its_ctlr() argument
1713 mutex_lock(&its->cmd_lock); in vgic_mmio_read_its_ctlr()
1714 if (its->creadr == its->cwriter) in vgic_mmio_read_its_ctlr()
1716 if (its->enabled) in vgic_mmio_read_its_ctlr()
1718 mutex_unlock(&its->cmd_lock); in vgic_mmio_read_its_ctlr()
1723 static void vgic_mmio_write_its_ctlr(struct kvm *kvm, struct vgic_its *its, in vgic_mmio_write_its_ctlr() argument
1727 mutex_lock(&its->cmd_lock); in vgic_mmio_write_its_ctlr()
1733 if (!its->enabled && (val & GITS_CTLR_ENABLE) && in vgic_mmio_write_its_ctlr()
1734 (!(its->baser_device_table & GITS_BASER_VALID) || in vgic_mmio_write_its_ctlr()
1735 !(its->baser_coll_table & GITS_BASER_VALID) || in vgic_mmio_write_its_ctlr()
1736 !(its->cbaser & GITS_CBASER_VALID))) in vgic_mmio_write_its_ctlr()
1739 its->enabled = !!(val & GITS_CTLR_ENABLE); in vgic_mmio_write_its_ctlr()
1740 if (!its->enabled) in vgic_mmio_write_its_ctlr()
1747 vgic_its_process_commands(kvm, its); in vgic_mmio_write_its_ctlr()
1750 mutex_unlock(&its->cmd_lock); in vgic_mmio_write_its_ctlr()
1772 static void its_mmio_write_wi(struct kvm *kvm, struct vgic_its *its, in its_mmio_write_wi() argument
1814 static int vgic_register_its_iodev(struct kvm *kvm, struct vgic_its *its, in vgic_register_its_iodev() argument
1817 struct vgic_io_device *iodev = &its->iodev; in vgic_register_its_iodev()
1821 if (!IS_VGIC_ADDR_UNDEF(its->vgic_its_base)) { in vgic_register_its_iodev()
1826 its->vgic_its_base = addr; in vgic_register_its_iodev()
1831 iodev->base_addr = its->vgic_its_base; in vgic_register_its_iodev()
1833 iodev->its = its; in vgic_register_its_iodev()
1896 struct vgic_its *its; in vgic_its_create() local
1901 its = kzalloc(sizeof(struct vgic_its), GFP_KERNEL); in vgic_its_create()
1902 if (!its) in vgic_its_create()
1908 kfree(its); in vgic_its_create()
1915 mutex_init(&its->its_lock); in vgic_its_create()
1916 mutex_init(&its->cmd_lock); in vgic_its_create()
1918 its->vgic_its_base = VGIC_ADDR_UNDEF; in vgic_its_create()
1920 INIT_LIST_HEAD(&its->device_list); in vgic_its_create()
1921 INIT_LIST_HEAD(&its->collection_list); in vgic_its_create()
1925 its->enabled = false; in vgic_its_create()
1926 its->dev = dev; in vgic_its_create()
1928 its->baser_device_table = INITIAL_BASER_VALUE | in vgic_its_create()
1930 its->baser_coll_table = INITIAL_BASER_VALUE | in vgic_its_create()
1934 dev->private = its; in vgic_its_create()
1936 return vgic_its_set_abi(its, NR_ITS_ABIS - 1); in vgic_its_create()
1942 struct vgic_its *its = kvm_dev->private; in vgic_its_destroy() local
1944 mutex_lock(&its->its_lock); in vgic_its_destroy()
1946 vgic_its_free_device_list(kvm, its); in vgic_its_destroy()
1947 vgic_its_free_collection_list(kvm, its); in vgic_its_destroy()
1949 mutex_unlock(&its->its_lock); in vgic_its_destroy()
1950 kfree(its); in vgic_its_destroy()
1980 struct vgic_its *its; in vgic_its_attr_regs_access() local
1985 its = dev->private; in vgic_its_attr_regs_access()
2005 if (IS_VGIC_ADDR_UNDEF(its->vgic_its_base)) { in vgic_its_attr_regs_access()
2023 addr = its->vgic_its_base + offset; in vgic_its_attr_regs_access()
2029 ret = region->uaccess_its_write(dev->kvm, its, addr, in vgic_its_attr_regs_access()
2032 region->its_write(dev->kvm, its, addr, len, *reg); in vgic_its_attr_regs_access()
2034 *reg = region->its_read(dev->kvm, its, addr, len); in vgic_its_attr_regs_access()
2079 typedef int (*entry_fn_t)(struct vgic_its *its, u32 id, void *entry,
2097 static int scan_its_table(struct vgic_its *its, gpa_t base, int size, u32 esz, in scan_its_table() argument
2100 struct kvm *kvm = its->dev->kvm; in scan_its_table()
2117 next_offset = fn(its, id, entry, opaque); in scan_its_table()
2135 static int vgic_its_save_ite(struct vgic_its *its, struct its_device *dev, in vgic_its_save_ite() argument
2138 struct kvm *kvm = its->dev->kvm; in vgic_its_save_ite()
2156 static int vgic_its_restore_ite(struct vgic_its *its, u32 event_id, in vgic_its_restore_ite() argument
2161 struct kvm *kvm = its->dev->kvm; in vgic_its_restore_ite()
2187 collection = find_collection(its, coll_id); in vgic_its_restore_ite()
2218 static int vgic_its_save_itt(struct vgic_its *its, struct its_device *device) in vgic_its_save_itt() argument
2220 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in vgic_its_save_itt()
2240 ret = vgic_its_save_ite(its, device, ite, gpa, ite_esz); in vgic_its_save_itt()
2255 static int vgic_its_restore_itt(struct vgic_its *its, struct its_device *dev) in vgic_its_restore_itt() argument
2257 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in vgic_its_restore_itt()
2263 ret = scan_its_table(its, base, max_size, ite_esz, 0, in vgic_its_restore_itt()
2280 static int vgic_its_save_dte(struct vgic_its *its, struct its_device *dev, in vgic_its_save_dte() argument
2283 struct kvm *kvm = its->dev->kvm; in vgic_its_save_dte()
2288 next_offset = compute_next_devid_offset(&its->device_list, dev); in vgic_its_save_dte()
2308 static int vgic_its_restore_dte(struct vgic_its *its, u32 id, in vgic_its_restore_dte() argument
2332 dev = vgic_its_alloc_device(its, id, itt_addr, num_eventid_bits); in vgic_its_restore_dte()
2336 ret = vgic_its_restore_itt(its, dev); in vgic_its_restore_dte()
2338 vgic_its_free_device(its->dev->kvm, dev); in vgic_its_restore_dte()
2364 static int vgic_its_save_device_tables(struct vgic_its *its) in vgic_its_save_device_tables() argument
2366 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in vgic_its_save_device_tables()
2367 u64 baser = its->baser_device_table; in vgic_its_save_device_tables()
2374 list_sort(NULL, &its->device_list, vgic_its_device_cmp); in vgic_its_save_device_tables()
2376 list_for_each_entry(dev, &its->device_list, dev_list) { in vgic_its_save_device_tables()
2380 if (!vgic_its_check_id(its, baser, in vgic_its_save_device_tables()
2384 ret = vgic_its_save_itt(its, dev); in vgic_its_save_device_tables()
2388 ret = vgic_its_save_dte(its, dev, eaddr, dte_esz); in vgic_its_save_device_tables()
2407 static int handle_l1_dte(struct vgic_its *its, u32 id, void *addr, in handle_l1_dte() argument
2410 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in handle_l1_dte()
2424 ret = scan_its_table(its, gpa, SZ_64K, dte_esz, in handle_l1_dte()
2434 static int vgic_its_restore_device_tables(struct vgic_its *its) in vgic_its_restore_device_tables() argument
2436 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in vgic_its_restore_device_tables()
2437 u64 baser = its->baser_device_table; in vgic_its_restore_device_tables()
2449 ret = scan_its_table(its, l1_gpa, l1_tbl_size, l1_esz, 0, in vgic_its_restore_device_tables()
2453 ret = scan_its_table(its, l1_gpa, l1_tbl_size, l1_esz, 0, in vgic_its_restore_device_tables()
2464 static int vgic_its_save_cte(struct vgic_its *its, in vgic_its_save_cte() argument
2474 return kvm_write_guest_lock(its->dev->kvm, gpa, &val, esz); in vgic_its_save_cte()
2477 static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz) in vgic_its_restore_cte() argument
2480 struct kvm *kvm = its->dev->kvm; in vgic_its_restore_cte()
2500 collection = find_collection(its, coll_id); in vgic_its_restore_cte()
2503 ret = vgic_its_alloc_collection(its, &collection, coll_id); in vgic_its_restore_cte()
2514 static int vgic_its_save_collection_table(struct vgic_its *its) in vgic_its_save_collection_table() argument
2516 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in vgic_its_save_collection_table()
2517 u64 baser = its->baser_coll_table; in vgic_its_save_collection_table()
2529 list_for_each_entry(collection, &its->collection_list, coll_list) { in vgic_its_save_collection_table()
2530 ret = vgic_its_save_cte(its, collection, gpa, cte_esz); in vgic_its_save_collection_table()
2546 ret = kvm_write_guest_lock(its->dev->kvm, gpa, &val, cte_esz); in vgic_its_save_collection_table()
2555 static int vgic_its_restore_collection_table(struct vgic_its *its) in vgic_its_restore_collection_table() argument
2557 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in vgic_its_restore_collection_table()
2558 u64 baser = its->baser_coll_table; in vgic_its_restore_collection_table()
2572 ret = vgic_its_restore_cte(its, gpa, cte_esz); in vgic_its_restore_collection_table()
2589 static int vgic_its_save_tables_v0(struct vgic_its *its) in vgic_its_save_tables_v0() argument
2593 ret = vgic_its_save_device_tables(its); in vgic_its_save_tables_v0()
2597 return vgic_its_save_collection_table(its); in vgic_its_save_tables_v0()
2605 static int vgic_its_restore_tables_v0(struct vgic_its *its) in vgic_its_restore_tables_v0() argument
2609 ret = vgic_its_restore_collection_table(its); in vgic_its_restore_tables_v0()
2613 return vgic_its_restore_device_tables(its); in vgic_its_restore_tables_v0()
2616 static int vgic_its_commit_v0(struct vgic_its *its) in vgic_its_commit_v0() argument
2620 abi = vgic_its_get_abi(its); in vgic_its_commit_v0()
2621 its->baser_coll_table &= ~GITS_BASER_ENTRY_SIZE_MASK; in vgic_its_commit_v0()
2622 its->baser_device_table &= ~GITS_BASER_ENTRY_SIZE_MASK; in vgic_its_commit_v0()
2624 its->baser_coll_table |= (GIC_ENCODE_SZ(abi->cte_esz, 5) in vgic_its_commit_v0()
2627 its->baser_device_table |= (GIC_ENCODE_SZ(abi->dte_esz, 5) in vgic_its_commit_v0()
2632 static void vgic_its_reset(struct kvm *kvm, struct vgic_its *its) in vgic_its_reset() argument
2635 its->baser_coll_table &= ~GITS_BASER_VALID; in vgic_its_reset()
2636 its->baser_device_table &= ~GITS_BASER_VALID; in vgic_its_reset()
2637 its->cbaser = 0; in vgic_its_reset()
2638 its->creadr = 0; in vgic_its_reset()
2639 its->cwriter = 0; in vgic_its_reset()
2640 its->enabled = 0; in vgic_its_reset()
2641 vgic_its_free_device_list(kvm, its); in vgic_its_reset()
2642 vgic_its_free_collection_list(kvm, its); in vgic_its_reset()
2673 static int vgic_its_ctrl(struct kvm *kvm, struct vgic_its *its, u64 attr) in vgic_its_ctrl() argument
2675 const struct vgic_its_abi *abi = vgic_its_get_abi(its); in vgic_its_ctrl()
2682 mutex_lock(&its->its_lock); in vgic_its_ctrl()
2685 mutex_unlock(&its->its_lock); in vgic_its_ctrl()
2692 vgic_its_reset(kvm, its); in vgic_its_ctrl()
2695 ret = abi->save_tables(its); in vgic_its_ctrl()
2698 ret = abi->restore_tables(its); in vgic_its_ctrl()
2703 mutex_unlock(&its->its_lock); in vgic_its_ctrl()
2711 struct vgic_its *its = dev->private; in vgic_its_set_attr() local
2726 ret = vgic_check_ioaddr(dev->kvm, &its->vgic_its_base, in vgic_its_set_attr()
2731 return vgic_register_its_iodev(dev->kvm, its, addr); in vgic_its_set_attr()
2734 return vgic_its_ctrl(dev->kvm, its, attr->attr); in vgic_its_set_attr()
2753 struct vgic_its *its = dev->private; in vgic_its_get_attr() local
2754 u64 addr = its->vgic_its_base; in vgic_its_get_attr()