From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60503) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XMB2r-0002JR-OY for qemu-devel@nongnu.org; Tue, 26 Aug 2014 03:19:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XMB2q-0006Ot-1P for qemu-devel@nongnu.org; Tue, 26 Aug 2014 03:19:57 -0400 Date: Tue, 26 Aug 2014 17:06:02 +1000 From: David Gibson Message-ID: <20140826070602.GV9923@voom.redhat.com> References: <1408097555-28126-1-git-send-email-aik@ozlabs.ru> <1408097555-28126-8-git-send-email-aik@ozlabs.ru> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="SidV/bKy1CyabPX8" Content-Disposition: inline In-Reply-To: <1408097555-28126-8-git-send-email-aik@ozlabs.ru> Subject: Re: [Qemu-devel] [RFC PATCH v2 07/13] spapr_rtas: Add Dynamic DMA windows (DDW) RTAS calls support List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexey Kardashevskiy Cc: Alex Williamson , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, Gavin Shan , Alexander Graf --SidV/bKy1CyabPX8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 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. >=20 > 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. >=20 > 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. >=20 > These RTAS handlers are implemented in a separate file to avoid polluting > spapr_iommu.c with PHB. >=20 > 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 re= ts) > +{ > + sPAPRPHBState *sphb; > + sPAPRPHBClass *spc; > + sPAPRTCETable *tcet =3D NULL; > + uint32_t addr, page_shift, window_shift, liobn; > + uint64_t buid; > + long ret; > + > + if ((nargs !=3D 5) || (nret !=3D 4)) { > + goto param_error_exit; > + } > + > + buid =3D ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2); > + addr =3D rtas_ld(args, 0); > + sphb =3D spapr_pci_find_phb(spapr, buid); > + if (!sphb) { > + goto param_error_exit; > + } > + > + spc =3D SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); > + if (!spc->ddw_create) { > + goto hw_error_exit; > + } > + > + page_shift =3D rtas_ld(args, 3); > + window_shift =3D rtas_ld(args, 4); > + /* Default 32bit window#0 is always there so +1 */ > + liobn =3D SPAPR_PCI_LIOBN(sphb->index, sphb->ddw_num + 1); > + > + ret =3D 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 re= ts) > +{ > + sPAPRPHBState *sphb; > + sPAPRPHBClass *spc; > + sPAPRTCETable *tcet; > + uint32_t liobn; > + long ret; > + > + if ((nargs !=3D 1) || (nret !=3D 1)) { > + goto param_error_exit; > + } > + > + liobn =3D rtas_ld(args, 0); > + tcet =3D spapr_tce_find_by_liobn(liobn); > + if (!tcet) { > + goto param_error_exit; > + } > + > + sphb =3D SPAPR_PCI_HOST_BRIDGE(OBJECT(tcet)->parent); > + if (!sphb) { > + goto param_error_exit; > + } > + > + spc =3D SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); > + if (!spc->ddw_remove) { > + goto hw_error_exit; > + } > + > + ret =3D 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; =2E. 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 ret= s) > +{ > + sPAPRPHBState *sphb; > + sPAPRPHBClass *spc; > + uint64_t buid; > + uint32_t addr; > + long ret; > + > + if ((nargs !=3D 3) || (nret !=3D 1)) { > + goto param_error_exit; > + } > + > + buid =3D ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2); > + addr =3D rtas_ld(args, 0); > + sphb =3D spapr_pci_find_phb(spapr, buid); > + if (!sphb) { > + goto param_error_exit; > + } > + > + spc =3D SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); > + if (!spc->ddw_reset) { > + goto hw_error_exit; > + } > + > + ret =3D 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. --=20 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 --SidV/bKy1CyabPX8 Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJT/DHaAAoJEGw4ysog2bOSyHoQAIphAShFLLWavvhK+qUhmhBX smawV9FlEfiz+bJn+gbozlnUsMFNcAtEWMAf/4a1hzztiWbm5DLz/iu315SmiF0G DUbCYpFqyUrBWsfgd0Dtr6r5snUSXuQ/RHPHsf+uYwzkLO2WQBvm0wCZZMyrKTAU DynJKXFuyKgX9qLACDKX7bZJZlsZb5tAMlVNREmDkwL2OGzC0TvGYOFhcfkj1vyE C3rF8RHABikA6XUVzWFwsHbNRmVkZCC3HLxkEt2fy6oJjn+Xl60Q+ErNTWGP2MGX thpznwbeJWmcA5LY326DIcciKcEyxgjEf2NgNIv0PqpiC7YGkTUHHBCAiAd6SJAK axtmE9noPvx+Gch0p+rCPEJATsPEIRMfX1yw1AqZ3GYvwyd+a1vDQl8m3SFEQsc9 1e/bTRK3oxOP/k5gucOb5gZaQricKJtA0LbjcGgFKc1bEcaxJunQxEhV3cxcvHNP FDuUFw/1mo++WQaQadRg9WOukbUkm9y6/WaQ3OshXZbzWPI6mh0mVzvAypwNme+f nI/H3hkm7U169JZQAWqw8kfk7kNiDeo4lmVpryUK9h+GvJtKDzLud2AEQ6Ydg4FS uva2zW5PpFV7+we4L+G1sQt+Ha8i/DJBGUlv0AzOSA7qP6szvv2tovbqk4ATK8fa sWmJjRSto3rWt8reY9L7 =QaJm -----END PGP SIGNATURE----- --SidV/bKy1CyabPX8--