[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] spapr-iommu: extend SPAPR_TCE_TABLE class
From: |
Mike Day |
Subject: |
Re: [Qemu-devel] spapr-iommu: extend SPAPR_TCE_TABLE class |
Date: |
Thu, 13 Mar 2014 14:04:04 -0400 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
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 <address@hidden>
Reviewed-by: Mike Day <address@hidden>
> ---
> 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
>
>
>
>
- Re: [Qemu-devel] spapr-iommu: extend SPAPR_TCE_TABLE class,
Mike Day <=