From: David Gibson <david@gibson.dropbear.id.au>
To: Alexey Kardashevskiy <aik@ozlabs.ru>
Cc: Alex Williamson <alex.williamson@redhat.com>,
qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
Gavin Shan <gwshan@linux.vnet.ibm.com>,
Alexander Graf <agraf@suse.de>
Subject: Re: [Qemu-devel] [RFC PATCH v2 07/13] spapr_rtas: Add Dynamic DMA windows (DDW) RTAS calls support
Date: Tue, 26 Aug 2014 17:06:02 +1000 [thread overview]
Message-ID: <20140826070602.GV9923@voom.redhat.com> (raw)
In-Reply-To: <1408097555-28126-8-git-send-email-aik@ozlabs.ru>
[-- Attachment #1: Type: text/plain, Size: 5329 bytes --]
On Fri, Aug 15, 2014 at 08:12:29PM +1000, Alexey Kardashevskiy wrote:
> This adds support for Dynamic DMA Windows (DDW) option defined by
> the SPAPR specification which allows to have additional DMA window(s)
> which can support page sizes other than 4K.
>
> The existing implementation of DDW in the guest tries to create one huge
> DMA window with 64K or 16MB pages and map the entire guest RAM to. If it
> succeeds, the guest switches to dma_direct_ops and never calls
> TCE hypercalls (H_PUT_TCE,...) again. This enables VFIO devices to use
> the entire RAM and not waste time on map/unmap.
>
> This adds 4 RTAS handlers:
> * ibm,query-pe-dma-window
> * ibm,create-pe-dma-window
> * ibm,remove-pe-dma-window
> * ibm,reset-pe-dma-window
> These are registered from type_init() callback.
>
> These RTAS handlers are implemented in a separate file to avoid polluting
> spapr_iommu.c with PHB.
>
> Since no PHB class implements new callback in this patch, no functional
> change is expected.
[snip]
> +static void rtas_ibm_create_pe_dma_window(PowerPCCPU *cpu,
> + sPAPREnvironment *spapr,
> + uint32_t token, uint32_t nargs,
> + target_ulong args,
> + uint32_t nret, target_ulong rets)
> +{
> + sPAPRPHBState *sphb;
> + sPAPRPHBClass *spc;
> + sPAPRTCETable *tcet = NULL;
> + uint32_t addr, page_shift, window_shift, liobn;
> + uint64_t buid;
> + long ret;
> +
> + if ((nargs != 5) || (nret != 4)) {
> + goto param_error_exit;
> + }
> +
> + buid = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2);
> + addr = rtas_ld(args, 0);
> + sphb = spapr_pci_find_phb(spapr, buid);
> + if (!sphb) {
> + goto param_error_exit;
> + }
> +
> + spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb);
> + if (!spc->ddw_create) {
> + goto hw_error_exit;
> + }
> +
> + page_shift = rtas_ld(args, 3);
> + window_shift = rtas_ld(args, 4);
> + /* Default 32bit window#0 is always there so +1 */
> + liobn = SPAPR_PCI_LIOBN(sphb->index, sphb->ddw_num + 1);
> +
> + ret = spc->ddw_create(sphb, page_shift, window_shift, liobn, &tcet);
> + trace_spapr_iommu_ddw_create(buid, addr, 1ULL << page_shift,
> + 1ULL << window_shift,
> + tcet ? tcet->bus_offset : 0xbaadf00d,
> + liobn, ret);
> + if (ret || !tcet) {
> + goto hw_error_exit;
> + }
> +
> + sphb->ddw_num++;
You increment ddw_num here...
[snip]
> +static void rtas_ibm_remove_pe_dma_window(PowerPCCPU *cpu,
> + sPAPREnvironment *spapr,
> + uint32_t token, uint32_t nargs,
> + target_ulong args,
> + uint32_t nret, target_ulong rets)
> +{
> + sPAPRPHBState *sphb;
> + sPAPRPHBClass *spc;
> + sPAPRTCETable *tcet;
> + uint32_t liobn;
> + long ret;
> +
> + if ((nargs != 1) || (nret != 1)) {
> + goto param_error_exit;
> + }
> +
> + liobn = rtas_ld(args, 0);
> + tcet = spapr_tce_find_by_liobn(liobn);
> + if (!tcet) {
> + goto param_error_exit;
> + }
> +
> + sphb = SPAPR_PCI_HOST_BRIDGE(OBJECT(tcet)->parent);
> + if (!sphb) {
> + goto param_error_exit;
> + }
> +
> + spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb);
> + if (!spc->ddw_remove) {
> + goto hw_error_exit;
> + }
> +
> + ret = spc->ddw_remove(sphb, tcet);
> + trace_spapr_iommu_ddw_remove(liobn, ret);
> + if (ret) {
> + goto hw_error_exit;
> + }
> +
> + rtas_st(rets, 0, RTAS_OUT_SUCCESS);
> + return;
.. but don't decrement it here. Is that a bug?
[snip]
> +static void rtas_ibm_reset_pe_dma_window(PowerPCCPU *cpu,
> + sPAPREnvironment *spapr,
> + uint32_t token, uint32_t nargs,
> + target_ulong args,
> + uint32_t nret, target_ulong rets)
> +{
> + sPAPRPHBState *sphb;
> + sPAPRPHBClass *spc;
> + uint64_t buid;
> + uint32_t addr;
> + long ret;
> +
> + if ((nargs != 3) || (nret != 1)) {
> + goto param_error_exit;
> + }
> +
> + buid = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2);
> + addr = rtas_ld(args, 0);
> + sphb = spapr_pci_find_phb(spapr, buid);
> + if (!sphb) {
> + goto param_error_exit;
> + }
> +
> + spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb);
> + if (!spc->ddw_reset) {
> + goto hw_error_exit;
> + }
> +
> + ret = spc->ddw_reset(sphb);
> + trace_spapr_iommu_ddw_reset(buid, addr, ret);
> + if (ret) {
> + goto hw_error_exit;
> + }
Likewise ddw_num doesn't seem to be reset here.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2014-08-26 7:19 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-15 10:12 [Qemu-devel] [RFC PATCH v2 00/13] spapr: vfio: Enable Dynamic DMA windows (DDW) Alexey Kardashevskiy
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 01/13] qom: Make object_child_foreach safe for objects removal Alexey Kardashevskiy
2014-08-19 0:39 ` David Gibson
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 02/13] spapr_iommu: Disable in-kernel IOMMU tables for >4GB windows Alexey Kardashevskiy
2014-08-19 0:43 ` David Gibson
2014-08-20 8:09 ` Alexey Kardashevskiy
2014-08-27 9:27 ` Alexander Graf
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 03/13] spapr_pci: Make find_phb()/find_dev() public Alexey Kardashevskiy
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 04/13] spapr_iommu: Make spapr_tce_find_by_liobn() public Alexey Kardashevskiy
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 05/13] spapr_pci: Introduce a liobn number generating macros Alexey Kardashevskiy
2014-08-19 0:44 ` David Gibson
2014-08-27 9:29 ` Alexander Graf
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 06/13] spapr_iommu: Implement free_table() helper Alexey Kardashevskiy
2014-08-26 6:16 ` David Gibson
2014-08-26 7:04 ` Alexey Kardashevskiy
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 07/13] spapr_rtas: Add Dynamic DMA windows (DDW) RTAS calls support Alexey Kardashevskiy
2014-08-26 7:06 ` David Gibson [this message]
2014-08-27 9:36 ` Alexander Graf
2014-08-27 13:56 ` Alexey Kardashevskiy
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 08/13] spapr_pci: Enable DDW Alexey Kardashevskiy
2014-08-26 7:14 ` David Gibson
2014-08-26 8:11 ` Alexey Kardashevskiy
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 09/13] spapr_pci_vfio: Call spapr_pci::reset on reset Alexey Kardashevskiy
2014-08-26 6:55 ` David Gibson
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 10/13] linux headers update for DDW Alexey Kardashevskiy
2014-08-18 17:42 ` Alex Williamson
2014-08-20 7:49 ` Alexey Kardashevskiy
2014-08-20 19:44 ` Alex Williamson
2014-08-21 2:47 ` Alexey Kardashevskiy
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 11/13] spapr_pci_vfio: Enable DDW Alexey Kardashevskiy
2014-08-26 7:19 ` David Gibson
2014-08-26 8:16 ` Alexey Kardashevskiy
2014-08-27 8:25 ` David Gibson
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 12/13] vfio: Enable DDW ioctls to VFIO IOMMU driver Alexey Kardashevskiy
2014-08-26 7:20 ` David Gibson
2014-08-26 8:20 ` Alexey Kardashevskiy
2014-08-27 8:42 ` David Gibson
2014-08-15 10:12 ` [Qemu-devel] [RFC PATCH v2 13/13] spapr: Add pseries-2.2 machine with default "ddw" option Alexey Kardashevskiy
2014-08-27 9:44 ` Alexander Graf
2014-08-27 14:24 ` Alexey Kardashevskiy
2014-08-27 9:44 ` Alexander Graf
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=20140826070602.GV9923@voom.redhat.com \
--to=david@gibson.dropbear.id.au \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=alex.williamson@redhat.com \
--cc=gwshan@linux.vnet.ibm.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.