On 20/11/13 16:39 +1100, Alexey Kardashevskiy wrote: > This adds a put_tce() callback to the SPAPR TCE TABLE device class. > The new callback allows to have different IOMMU types such as upcoming > VFIO IOMMU and it will be used more by the upcoming Multi-TCE support. > > This reworks the H_PUT_TCE handler to make use of the new put_tce() > callback. > > Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> Reviewed-by: Mike Day <ncm...@ncultra.org>
> --- > hw/ppc/spapr_iommu.c | 21 +++++++++++++++++---- > include/hw/ppc/spapr.h | 13 +++++++++++++ > 2 files changed, 30 insertions(+), 4 deletions(-) > > diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c > index ef45f4f..0016c13 100644 > --- a/hw/ppc/spapr_iommu.c > +++ b/hw/ppc/spapr_iommu.c > @@ -207,7 +207,7 @@ static target_ulong put_tce_emu(sPAPRTCETable *tcet, > target_ulong ioba, > IOMMUTLBEntry entry; > > if (ioba >= tcet->window_size) { > - hcall_dprintf("spapr_vio_put_tce on out-of-bounds IOBA 0x" > + hcall_dprintf("spapr put_tce_emu on out-of-bounds IOBA 0x" > TARGET_FMT_lx "\n", ioba); > return H_PARAMETER; > } > @@ -232,12 +232,21 @@ static target_ulong h_put_tce(PowerPCCPU *cpu, > sPAPREnvironment *spapr, > target_ulong tce = args[2]; > target_ulong ret = H_PARAMETER; > sPAPRTCETable *tcet = spapr_tce_find_by_liobn(liobn); > + sPAPRTCETableClass *info; > + > + if (!tcet) { > + return H_PARAMETER; > + } > + > + info = SPAPR_TCE_TABLE_GET_CLASS(tcet); > + if (!info || !info->put_tce) { > + return H_PARAMETER; > + } > > ioba &= ~(SPAPR_TCE_PAGE_SIZE - 1); > > - if (tcet) { > - ret = put_tce_emu(tcet, ioba, tce); > - } > + ret = info->put_tce(tcet, ioba, tce); > + > trace_spapr_iommu_put(liobn, ioba, tce, ret); > > return ret; > @@ -287,9 +296,12 @@ int spapr_tcet_dma_dt(void *fdt, int node_off, const > char *propname, > static void spapr_tce_table_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > + sPAPRTCETableClass *stc = SPAPR_TCE_TABLE_CLASS(klass); > + > dc->vmsd = &vmstate_spapr_tce_table; > dc->init = spapr_tce_table_realize; > dc->reset = spapr_tce_reset; > + stc->put_tce = put_tce_emu; > > QLIST_INIT(&spapr_tce_tables); > > @@ -302,6 +314,7 @@ static TypeInfo spapr_tce_table_info = { > .parent = TYPE_DEVICE, > .instance_size = sizeof(sPAPRTCETable), > .class_init = spapr_tce_table_class_init, > + .class_size = sizeof(sPAPRTCETableClass), > .instance_finalize = spapr_tce_table_finalize, > }; > > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h > index fdaab2d..827cda2 100644 > --- a/include/hw/ppc/spapr.h > +++ b/include/hw/ppc/spapr.h > @@ -367,12 +367,25 @@ int spapr_rtas_device_tree_setup(void *fdt, hwaddr > rtas_addr, > > #define RTAS_ERROR_LOG_MAX 2048 > > +typedef struct sPAPRTCETableClass sPAPRTCETableClass; > typedef struct sPAPRTCETable sPAPRTCETable; > > #define TYPE_SPAPR_TCE_TABLE "spapr-tce-table" > #define SPAPR_TCE_TABLE(obj) \ > OBJECT_CHECK(sPAPRTCETable, (obj), TYPE_SPAPR_TCE_TABLE) > > +#define SPAPR_TCE_TABLE_CLASS(klass) \ > + OBJECT_CLASS_CHECK(sPAPRTCETableClass, (klass), TYPE_SPAPR_TCE_TABLE) > +#define SPAPR_TCE_TABLE_GET_CLASS(obj) \ > + OBJECT_GET_CLASS(sPAPRTCETableClass, (obj), TYPE_SPAPR_TCE_TABLE) > + > +struct sPAPRTCETableClass { > + DeviceClass parent_class; > + > + target_ulong (*put_tce)(sPAPRTCETable *tcet, target_ulong ioba, > + target_ulong tce); > +}; > + > struct sPAPRTCETable { > DeviceState parent; > uint32_t liobn; > -- > 1.8.4.rc4 > > > >