Lines Matching refs:tcet

49     SpaprTceTable *tcet;  in spapr_tce_find_by_liobn()  local
57 QLIST_FOREACH(tcet, &spapr_tce_tables, list) { in spapr_tce_find_by_liobn()
58 if (tcet->liobn == (uint32_t)liobn) { in spapr_tce_find_by_liobn()
59 return tcet; in spapr_tce_find_by_liobn()
118 SpaprTceTable *tcet = container_of(iommu, SpaprTceTable, iommu); in spapr_tce_translate_iommu() local
128 if ((addr >> tcet->page_shift) < tcet->nb_table) { in spapr_tce_translate_iommu()
130 hwaddr page_mask = IOMMU_PAGE_MASK(tcet->page_shift); in spapr_tce_translate_iommu()
132 tce = tcet->table[addr >> tcet->page_shift]; in spapr_tce_translate_iommu()
138 trace_spapr_iommu_xlate(tcet->liobn, addr, ret.translated_addr, ret.perm, in spapr_tce_translate_iommu()
150 SpaprTceTable *tcet = container_of(iommu_mr, SpaprTceTable, iommu); in spapr_tce_replay() local
152 if (tcet->skipping_replay) { in spapr_tce_replay()
176 SpaprTceTable *tcet = SPAPR_TCE_TABLE(opaque); in spapr_tce_table_pre_save() local
178 tcet->mig_table = tcet->table; in spapr_tce_table_pre_save()
179 tcet->mig_nb_table = tcet->nb_table; in spapr_tce_table_pre_save()
181 trace_spapr_iommu_pre_save(tcet->liobn, tcet->mig_nb_table, in spapr_tce_table_pre_save()
182 tcet->bus_offset, tcet->page_shift); in spapr_tce_table_pre_save()
189 SpaprTceTable *tcet = container_of(iommu, SpaprTceTable, iommu); in spapr_tce_get_min_page_size() local
191 return 1ULL << tcet->page_shift; in spapr_tce_get_min_page_size()
197 SpaprTceTable *tcet = container_of(iommu, SpaprTceTable, iommu); in spapr_tce_get_attr() local
200 *(int *) data = tcet->fd; in spapr_tce_get_attr()
229 SpaprTceTable *tcet = SPAPR_TCE_TABLE(opaque); in spapr_tce_table_post_load() local
230 uint32_t old_nb_table = tcet->nb_table; in spapr_tce_table_post_load()
231 uint64_t old_bus_offset = tcet->bus_offset; in spapr_tce_table_post_load()
232 uint32_t old_page_shift = tcet->page_shift; in spapr_tce_table_post_load()
234 if (tcet->vdev) { in spapr_tce_table_post_load()
235 spapr_vio_set_bypass(tcet->vdev, tcet->bypass); in spapr_tce_table_post_load()
238 if (tcet->mig_nb_table != tcet->nb_table) { in spapr_tce_table_post_load()
239 spapr_tce_table_disable(tcet); in spapr_tce_table_post_load()
242 if (tcet->mig_nb_table) { in spapr_tce_table_post_load()
243 if (!tcet->nb_table) { in spapr_tce_table_post_load()
244 spapr_tce_table_enable(tcet, old_page_shift, old_bus_offset, in spapr_tce_table_post_load()
245 tcet->mig_nb_table); in spapr_tce_table_post_load()
248 memcpy(tcet->table, tcet->mig_table, in spapr_tce_table_post_load()
249 tcet->nb_table * sizeof(tcet->table[0])); in spapr_tce_table_post_load()
251 g_free(tcet->mig_table); in spapr_tce_table_post_load()
252 tcet->mig_table = NULL; in spapr_tce_table_post_load()
255 trace_spapr_iommu_post_load(tcet->liobn, old_nb_table, tcet->nb_table, in spapr_tce_table_post_load()
256 tcet->bus_offset, tcet->page_shift); in spapr_tce_table_post_load()
263 SpaprTceTable *tcet = opaque; in spapr_tce_table_ex_needed() local
265 return tcet->bus_offset || tcet->page_shift != 0xC; in spapr_tce_table_ex_needed()
307 SpaprTceTable *tcet = SPAPR_TCE_TABLE(dev); in spapr_tce_table_realize() local
308 Object *tcetobj = OBJECT(tcet); in spapr_tce_table_realize()
311 tcet->fd = -1; in spapr_tce_table_realize()
312 tcet->need_vfio = false; in spapr_tce_table_realize()
313 tmp = g_strdup_printf("tce-root-%x", tcet->liobn); in spapr_tce_table_realize()
314 memory_region_init(&tcet->root, tcetobj, tmp, UINT64_MAX); in spapr_tce_table_realize()
317 tmp = g_strdup_printf("tce-iommu-%x", tcet->liobn); in spapr_tce_table_realize()
318 memory_region_init_iommu(&tcet->iommu, sizeof(tcet->iommu), in spapr_tce_table_realize()
323 QLIST_INSERT_HEAD(&spapr_tce_tables, tcet, list); in spapr_tce_table_realize()
325 vmstate_register(VMSTATE_IF(tcet), tcet->liobn, &vmstate_spapr_tce_table, in spapr_tce_table_realize()
326 tcet); in spapr_tce_table_realize()
329 void spapr_tce_set_need_vfio(SpaprTceTable *tcet, bool need_vfio) in spapr_tce_set_need_vfio() argument
331 size_t table_size = tcet->nb_table * sizeof(uint64_t); in spapr_tce_set_need_vfio()
335 g_assert(need_vfio != tcet->need_vfio); in spapr_tce_set_need_vfio()
337 tcet->need_vfio = need_vfio; in spapr_tce_set_need_vfio()
339 if (!need_vfio || (tcet->fd != -1 && kvmppc_has_cap_spapr_vfio())) { in spapr_tce_set_need_vfio()
343 oldtable = tcet->table; in spapr_tce_set_need_vfio()
345 tcet->table = spapr_tce_alloc_table(tcet->liobn, in spapr_tce_set_need_vfio()
346 tcet->page_shift, in spapr_tce_set_need_vfio()
347 tcet->bus_offset, in spapr_tce_set_need_vfio()
348 tcet->nb_table, in spapr_tce_set_need_vfio()
351 memcpy(tcet->table, oldtable, table_size); in spapr_tce_set_need_vfio()
353 spapr_tce_free_table(oldtable, tcet->fd, tcet->nb_table); in spapr_tce_set_need_vfio()
355 tcet->fd = newfd; in spapr_tce_set_need_vfio()
360 SpaprTceTable *tcet; in spapr_tce_new_table() local
369 tcet = SPAPR_TCE_TABLE(object_new(TYPE_SPAPR_TCE_TABLE)); in spapr_tce_new_table()
370 tcet->liobn = liobn; in spapr_tce_new_table()
373 object_property_add_child(OBJECT(owner), tmp, OBJECT(tcet)); in spapr_tce_new_table()
375 object_unref(OBJECT(tcet)); in spapr_tce_new_table()
377 qdev_realize(DEVICE(tcet), NULL, NULL); in spapr_tce_new_table()
379 return tcet; in spapr_tce_new_table()
382 void spapr_tce_table_enable(SpaprTceTable *tcet, in spapr_tce_table_enable() argument
386 if (tcet->nb_table) { in spapr_tce_table_enable()
391 tcet->bus_offset = bus_offset; in spapr_tce_table_enable()
392 tcet->page_shift = page_shift; in spapr_tce_table_enable()
393 tcet->nb_table = nb_table; in spapr_tce_table_enable()
394 tcet->table = spapr_tce_alloc_table(tcet->liobn, in spapr_tce_table_enable()
395 tcet->page_shift, in spapr_tce_table_enable()
396 tcet->bus_offset, in spapr_tce_table_enable()
397 tcet->nb_table, in spapr_tce_table_enable()
398 &tcet->fd, in spapr_tce_table_enable()
399 tcet->need_vfio); in spapr_tce_table_enable()
401 memory_region_set_size(MEMORY_REGION(&tcet->iommu), in spapr_tce_table_enable()
402 (uint64_t)tcet->nb_table << tcet->page_shift); in spapr_tce_table_enable()
403 memory_region_add_subregion(&tcet->root, tcet->bus_offset, in spapr_tce_table_enable()
404 MEMORY_REGION(&tcet->iommu)); in spapr_tce_table_enable()
407 void spapr_tce_table_disable(SpaprTceTable *tcet) in spapr_tce_table_disable() argument
409 if (!tcet->nb_table) { in spapr_tce_table_disable()
413 memory_region_del_subregion(&tcet->root, MEMORY_REGION(&tcet->iommu)); in spapr_tce_table_disable()
414 memory_region_set_size(MEMORY_REGION(&tcet->iommu), 0); in spapr_tce_table_disable()
416 spapr_tce_free_table(tcet->table, tcet->fd, tcet->nb_table); in spapr_tce_table_disable()
417 tcet->fd = -1; in spapr_tce_table_disable()
418 tcet->table = NULL; in spapr_tce_table_disable()
419 tcet->bus_offset = 0; in spapr_tce_table_disable()
420 tcet->page_shift = 0; in spapr_tce_table_disable()
421 tcet->nb_table = 0; in spapr_tce_table_disable()
426 SpaprTceTable *tcet = SPAPR_TCE_TABLE(dev); in spapr_tce_table_unrealize() local
428 vmstate_unregister(VMSTATE_IF(tcet), &vmstate_spapr_tce_table, tcet); in spapr_tce_table_unrealize()
430 QLIST_REMOVE(tcet, list); in spapr_tce_table_unrealize()
432 spapr_tce_table_disable(tcet); in spapr_tce_table_unrealize()
435 MemoryRegion *spapr_tce_get_iommu(SpaprTceTable *tcet) in spapr_tce_get_iommu() argument
437 return &tcet->root; in spapr_tce_get_iommu()
442 SpaprTceTable *tcet = SPAPR_TCE_TABLE(dev); in spapr_tce_reset() local
443 size_t table_size = tcet->nb_table * sizeof(uint64_t); in spapr_tce_reset()
445 if (tcet->nb_table) { in spapr_tce_reset()
446 memset(tcet->table, 0, table_size); in spapr_tce_reset()
450 static target_ulong put_tce_emu(SpaprTceTable *tcet, target_ulong ioba, in put_tce_emu() argument
454 hwaddr page_mask = IOMMU_PAGE_MASK(tcet->page_shift); in put_tce_emu()
455 unsigned long index = (ioba - tcet->bus_offset) >> tcet->page_shift; in put_tce_emu()
457 if (index >= tcet->nb_table) { in put_tce_emu()
463 tcet->table[index] = tce; in put_tce_emu()
466 event.entry.iova = (ioba - tcet->bus_offset) & page_mask; in put_tce_emu()
471 memory_region_notify_iommu(&tcet->iommu, 0, event); in put_tce_emu()
487 SpaprTceTable *tcet = spapr_tce_find_by_liobn(liobn); in h_put_tce_indirect() local
491 if (!tcet) { in h_put_tce_indirect()
499 page_mask = IOMMU_PAGE_MASK(tcet->page_shift); in h_put_tce_indirect()
500 page_size = IOMMU_PAGE_SIZE(tcet->page_shift); in h_put_tce_indirect()
506 ret = put_tce_emu(tcet, ioba, tce); in h_put_tce_indirect()
531 SpaprTceTable *tcet = spapr_tce_find_by_liobn(liobn); in h_stuff_tce() local
534 if (!tcet) { in h_stuff_tce()
538 if (npages > tcet->nb_table) { in h_stuff_tce()
542 page_mask = IOMMU_PAGE_MASK(tcet->page_shift); in h_stuff_tce()
543 page_size = IOMMU_PAGE_SIZE(tcet->page_shift); in h_stuff_tce()
547 ret = put_tce_emu(tcet, ioba, tce_value); in h_stuff_tce()
568 SpaprTceTable *tcet = spapr_tce_find_by_liobn(liobn); in h_put_tce() local
570 if (tcet) { in h_put_tce()
571 hwaddr page_mask = IOMMU_PAGE_MASK(tcet->page_shift); in h_put_tce()
575 ret = put_tce_emu(tcet, ioba, tce); in h_put_tce()
586 static target_ulong get_tce_emu(SpaprTceTable *tcet, target_ulong ioba, in get_tce_emu() argument
589 unsigned long index = (ioba - tcet->bus_offset) >> tcet->page_shift; in get_tce_emu()
591 if (index >= tcet->nb_table) { in get_tce_emu()
597 *tce = tcet->table[index]; in get_tce_emu()
609 SpaprTceTable *tcet = spapr_tce_find_by_liobn(liobn); in h_get_tce() local
611 if (tcet) { in h_get_tce()
612 hwaddr page_mask = IOMMU_PAGE_MASK(tcet->page_shift); in h_get_tce()
616 ret = get_tce_emu(tcet, ioba, &tce); in h_get_tce()
661 SpaprTceTable *tcet) in spapr_tcet_dma_dt() argument
663 if (!tcet) { in spapr_tcet_dma_dt()
668 tcet->liobn, 0, tcet->nb_table << tcet->page_shift); in spapr_tcet_dma_dt()