From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: qemu-devel@nongnu.org
Cc: Alexey Kardashevskiy <aik@ozlabs.ru>,
Alexander Graf <agraf@suse.de>,
Alex Williamson <alex.williamson@redhat.com>,
qemu-ppc@nongnu.org, David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PATCH v4 08/12] spapr_iommu: introduce SPAPR_TCE_TABLE class
Date: Fri, 30 Aug 2013 20:15:34 +1000 [thread overview]
Message-ID: <1377857738-14789-9-git-send-email-aik@ozlabs.ru> (raw)
In-Reply-To: <1377857738-14789-1-git-send-email-aik@ozlabs.ru>
This introduces a SPAPR TCE TABLE device class with a put_tce() callback.
This reworks the H_PUT_TCE, H_PUT_TCE_INDIRECT, H_STUFF_TCE hypercall
handlers to make use of the new put_tce() callback.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
hw/ppc/spapr_iommu.c | 76 +++++++++++++++++++++++++++++++++++++++-----------
include/hw/ppc/spapr.h | 13 +++++++++
2 files changed, 73 insertions(+), 16 deletions(-)
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index 022e268..0b235b3 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -235,17 +235,34 @@ static target_ulong h_put_tce_indirect(PowerPCCPU *cpu,
target_ulong npages = args[3];
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;
+ }
+
+ if ((tce_list & SPAPR_TCE_PAGE_MASK) || (npages > 512)) {
+ return H_PARAMETER;
+ }
ioba &= ~SPAPR_TCE_PAGE_MASK;
tce_list &= ~SPAPR_TCE_PAGE_MASK;
+ if (liobn & 0xFFFFFFFF00000000ULL) {
+ hcall_dprintf("spapr_vio_put_tce on out-of-boundsw LIOBN "
+ TARGET_FMT_lx "\n", liobn);
+ return H_PARAMETER;
+ }
- if (tcet) {
- for (i = 0; i < npages; i++, ioba += SPAPR_TCE_PAGE_SIZE) {
- target_ulong tce = ldq_phys(tce_list + i * sizeof(target_ulong));
- ret = put_tce_emu(tcet, ioba, tce);
- if (ret) {
- break;
- }
+ for (i = 0; i < npages; ++i, ioba += SPAPR_TCE_PAGE_SIZE) {
+ target_ulong tce = ldq_phys(tce_list + i * sizeof(target_ulong));
+ ret = info->put_tce(tcet, ioba, tce);
+ if (ret) {
+ break;
}
}
trace_spapr_iommu_indirect(liobn, ioba, tce_list, ret);
@@ -263,15 +280,29 @@ static target_ulong h_stuff_tce(PowerPCCPU *cpu, sPAPREnvironment *spapr,
target_ulong npages = args[3];
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;
+ }
+
+ if (liobn & 0xFFFFFFFF00000000ULL) {
+ hcall_dprintf("spapr_vio_put_tce on out-of-boundsw LIOBN "
+ TARGET_FMT_lx "\n", liobn);
+ return H_PARAMETER;
+ }
ioba &= ~SPAPR_TCE_PAGE_MASK;
- if (tcet) {
- for (i = 0; i < npages; ++i, ioba += SPAPR_TCE_PAGE_SIZE) {
- ret = put_tce_emu(tcet, ioba, tce_value);
- if (ret) {
- break;
- }
+ for (i = 0; i < npages; ++i, ioba += SPAPR_TCE_PAGE_SIZE) {
+ ret = info->put_tce(tcet, ioba, tce_value);
+ if (ret) {
+ break;
}
}
trace_spapr_iommu_stuff(liobn, ioba, tce_value, ret);
@@ -287,12 +318,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;
@@ -342,9 +382,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);
@@ -359,6 +402,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 ca175b0..a54de97 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -362,12 +362,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
next prev parent reply other threads:[~2013-08-30 10:16 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-30 10:15 [Qemu-devel] [PATCH v4 00/12] vfio on spapr-ppc64 Alexey Kardashevskiy
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 01/12] vfio: Introduce VFIO address spaces Alexey Kardashevskiy
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 02/12] vfio: Create VFIOAddressSpace objects as needed Alexey Kardashevskiy
2013-09-05 18:24 ` Alex Williamson
2013-09-10 8:09 ` Alexey Kardashevskiy
2013-09-10 21:51 ` Alex Williamson
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 03/12] vfio: Add guest side IOMMU support Alexey Kardashevskiy
2013-09-05 18:49 ` Alex Williamson
2013-09-10 8:22 ` Alexey Kardashevskiy
2013-09-10 22:02 ` Alex Williamson
2013-09-11 6:15 ` Paolo Bonzini
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 04/12] spapr vfio: add vfio_container_spapr_get_info() Alexey Kardashevskiy
2013-09-05 19:01 ` Alex Williamson
2013-09-10 8:36 ` Alexey Kardashevskiy
2013-09-10 22:11 ` Alex Williamson
2013-09-13 10:11 ` Alexey Kardashevskiy
2013-09-25 20:29 ` Alex Williamson
2013-09-26 10:22 ` Alexey Kardashevskiy
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 05/12] spapr_pci: convert init to realize Alexey Kardashevskiy
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 06/12] spapr_pci: add spapr_pci trace Alexey Kardashevskiy
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 07/12] spapr_pci: converts fprintf to error_report Alexey Kardashevskiy
2013-08-30 10:15 ` Alexey Kardashevskiy [this message]
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 09/12] spapr_iommu: add SPAPR VFIO IOMMU Alexey Kardashevskiy
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 10/12] spapr vfio: add spapr-pci-vfio-host-bridge to support vfio Alexey Kardashevskiy
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 11/12] spapr vfio: enable for spapr Alexey Kardashevskiy
2013-09-05 19:05 ` Alex Williamson
2013-09-10 9:00 ` Alexey Kardashevskiy
2013-09-10 22:13 ` Alex Williamson
2013-09-13 11:34 ` Alexey Kardashevskiy
2013-09-25 20:33 ` Alex Williamson
2013-08-30 10:15 ` [Qemu-devel] [PATCH v4 12/12] spapr kvm vfio: enable in-kernel acceleration Alexey Kardashevskiy
2013-09-05 6:43 ` [Qemu-devel] [PATCH v4 00/12] vfio on spapr-ppc64 Alexey Kardashevskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1377857738-14789-9-git-send-email-aik@ozlabs.ru \
--to=aik@ozlabs.ru \
--cc=agraf@suse.de \
--cc=alex.williamson@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).