On 12/05/2013 08:39 PM, Alexey Kardashevskiy wrote: > On 11/20/2013 04:39 PM, 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. > > > Ping?
Ping? > >> >> Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> >> --- >> 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; >> > > -- Alexey