From nobody Fri May 3 03:20:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1503313022097939.6424648044137; Mon, 21 Aug 2017 03:57:02 -0700 (PDT) Received: from localhost ([::1]:33247 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1djkOC-0001xX-SA for importer@patchew.org; Mon, 21 Aug 2017 06:57:00 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33101) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1djkJD-0006F9-Uv for qemu-devel@nongnu.org; Mon, 21 Aug 2017 06:51:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1djkJ9-00024S-7F for qemu-devel@nongnu.org; Mon, 21 Aug 2017 06:51:52 -0400 Received: from mail-cys01nam02on0062.outbound.protection.outlook.com ([104.47.37.62]:43952 helo=NAM02-CY1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1djkJ8-00023k-UO; Mon, 21 Aug 2017 06:51:47 -0400 Received: from CY1PR03CA0013.namprd03.prod.outlook.com (10.174.128.23) by BN3PR03MB2259.namprd03.prod.outlook.com (10.166.74.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1362.18; Mon, 21 Aug 2017 10:51:45 +0000 Received: from BL2FFO11FD056.protection.gbl (2a01:111:f400:7c09::180) by CY1PR03CA0013.outlook.office365.com (2603:10b6:600::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1362.18 via Frontend Transport; Mon, 21 Aug 2017 10:51:44 +0000 Received: from tx30smr01.am.freescale.net (192.88.168.50) by BL2FFO11FD056.mail.protection.outlook.com (10.173.161.184) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1341.15 via Frontend Transport; Mon, 21 Aug 2017 10:51:39 +0000 Received: from localhost.localdomain.ap.freescale.net ([10.232.14.21]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v7LApQtD004847; Mon, 21 Aug 2017 03:51:33 -0700 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; From: Bharat Bhushan To: , , , , , , Date: Mon, 21 Aug 2017 16:18:53 +0530 Message-ID: <1503312534-6642-2-git-send-email-Bharat.Bhushan@nxp.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1503312534-6642-1-git-send-email-Bharat.Bhushan@nxp.com> References: <1503312534-6642-1-git-send-email-Bharat.Bhushan@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131477863043825261; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39380400002)(39860400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(6666003)(81156014)(2950100002)(5003940100001)(5660300001)(48376002)(104016004)(105606002)(106466001)(86362001)(7416002)(85426001)(2201001)(575784001)(2906002)(81166006)(77096006)(39060400002)(76176999)(47776003)(8676002)(189998001)(36756003)(498600001)(97736004)(50226002)(53936002)(68736007)(8936002)(356003)(4326008)(8656003)(50466002)(626005)(305945005)(54906002)(50986999)(72206003)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:BN3PR03MB2259; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD056; 1:jgnvAZhsGDP9KQhG/GDJCK0TfCxEEzdSWtQKi+SGeDFf/njzCWXkyAbcFcBF4iAtGxMv4bF38wZ6fJxLLmgmkftlvzGtqx9pEcykUdbyMVSMDvtFYHUcZV8UHWMMxFd7 MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 176ce168-faa9-434a-9d0e-08d4e8829d02 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603031)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:BN3PR03MB2259; X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB2259; 3:F620yyGDHOlK3alyCH7yswObrzkf1tkZYN5aflrem8lilrWYUI2JkW7qZguN1NjzcoFM268x+iOA7Md8dBWDw0pRS9S+JpZvPRnC/X4nEto0NOoy48VhKd64R0xImY52PkjRBh+c/pJxmdFzq6rQJLTtxPedJH1Ve+3sZXcjI4zaSafHCeYEtVc2u/MOVgJfJKS9ACsRei9jJFzdeU4qkKusbS+eyyKduuHfcvx68X7CQ9KKtL6iyi/YDZ4qHkK5/VVDoc3mNvQ7TOgRzzfgixAiO6Q6nt6fnASSI+URYyclQUUKZxNUWkfEpyBXGzhXBfXA5bw6l4v0NkpueA6KF+5D1pxS1DuR4SGYj3g6qGo=; 25:3jLcwqBH/EnPFOffDyGmcFyP+hGiUlyXYcFKWYWaE5FJqKK0X+Lqk2Gi3hF7iYi5hiBTFnumwOTKm3KyDNjAMx7kXpST1dQwngXmtr9u5VXxqXXZqu8pOEsOIognyksgXg69Y+kj2Bt+FTpi5ILqpgbvXwaUq3OYrlO3rVQGhsJwxWeNm1Ez9QQcyPHqUVuswQhlcrQjeDljLqdzydR892h0d/Dg3W0kPnlNi6TkjcmsO7vgk/BCn6c/aNEi8HnzRY+RNBK9V0xZPQJLU6J5lXV3M/yEZ8oxelUhF+2vYrRPUR4DkoRN2m2ugAK3+50Gn49G2jCzswgob/sa1yYl1Q== X-MS-TrafficTypeDiagnostic: BN3PR03MB2259: X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB2259; 31:OTKgzD3W6OL8qA3WFoEvhV+CCopH5l/HRGwXacC4AY+XjmzcqARlMJQ9UML5BxaJt9Ji6oum/Q/0U4zWU+4c7m2+/ozkPVMH2qIZTRW1ws7l9USGsXIa1Eyrj2LANFJVVcCZdX6Gip7MTl98Bo0Mp2dyeinYrW0+wlA1FPOwDLHCwM/DsWnBOwNqtYgczJWHN8urYPfBYaIuEJUKZotWcZr0pUfvA0WJd6+mzcNZOsQ=; 4:BRRoCwgTDwBbRm8flj/A4rZ/cLTm67eMy9ep0pfRoh/9L7VZqxrOsvCUy5ta00ajrx3FqL341v5fGti/+PgxaJlKOFhRb+seHPK4atNRd5fARqKlClOaDNoy0dkOb0VA6/8jyXcICC2aESYGPUNWAMmEOewCwqFl1WscdeFEXNYb1apOiPkeRea7bR9sYvrs++sj72+/WKNGpXYVTeszRjZh9IaHBEJUcaucWfsZhW3bDBe6pLWgstCwM/DANncebqKpAR8kNm8HNtTtqZBdLhHStwv7OdFZWzBy8vuIdG8= X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(601004)(2401047)(13018025)(8121501046)(13016025)(5005006)(10201501046)(93006095)(93001095)(100000703101)(100105400095)(3002001)(6055026)(6096035)(20161123563025)(20161123556025)(20161123559100)(20161123565025)(20161123561025)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:BN3PR03MB2259; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:BN3PR03MB2259; X-Forefront-PRVS: 040655413E X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN3PR03MB2259; 23:JMrgyecnbQwxQlfFc7l1/tiSIn+pwdWivxsZwkK4G?= =?us-ascii?Q?o64ZA6P6tBC/S5TKMxqsNa81TX8g6lUnkqbamI8hPaeI0nY0lIgz8PdKvBa4?= =?us-ascii?Q?lXaRq53gCeaPpBjeGNlqUo8Zo5sHv0jwbFpXVKlwwoiKqbkd/6EjuAlv3xwf?= =?us-ascii?Q?Ib2x/EDdOgdfPP7crJxbJqpMHd2nUXP4m1lIdjekKHj7KZVgqw+c5uJ26r3v?= =?us-ascii?Q?Uv82mOOlpbElxxoOqTBQOKiwABBdkzI+zaHFrd73Adi7LLepf3B6Gh4afmIp?= =?us-ascii?Q?+mYgBQ/hfYYFvdgWTprVQGNIV5n0fcD6E5tjv7OoGHetrzW+NvLDNR8Ce+dk?= =?us-ascii?Q?z4BWvslVIWLaWxvQiCfLJcJN2nVGOGvIx+PeZd+b0N6O5mN+5i2zSuj8wbIu?= =?us-ascii?Q?gCES4d1pjZbT90LzwuS/Fer9DBhvW1QbwpNi1Uq44Hrg4dqSeJWfYsCqflzU?= =?us-ascii?Q?pHa02O4RS3hENUis95DnczKAy5jif1iS2ymoskQyPxM/A9q7bwe4H9NIpXU7?= =?us-ascii?Q?2iLnE1wxFI6cyjRO6m3csnBDEpXvD4Wk9jmP13WajDl9TUj0+OLmn6+P9hRy?= =?us-ascii?Q?g80WasIO40gTGgCMOAxkf7+4C2fMEvGDH17THVmtNSLQDwZfT2lzrrCSQ3IG?= =?us-ascii?Q?GUD+krDaSZxX/6KfJHrM3/wadJNQ79ciFY5ucn8BAj8M3ziXahgHGnCrrSdl?= =?us-ascii?Q?oFY4QbX+CWGUsUx82Zw9fzOWW/1we3EFsi+dZfBuZN+UyfVu9PfvwK2SFXCz?= =?us-ascii?Q?QEC3IayAuGFafFWjDNV2ACmHtC2uAqe1Gt16yThLLbJ4KN3jGu+WI0J7dpZR?= =?us-ascii?Q?kmmHbSA4NCpAW+klSawbycW+f80iS9eGOBhCTnUQaL3ypLF6Wy1uxrtRzLmv?= =?us-ascii?Q?691Xw3v3/CVoVMLQEH3fFMwdwGaC4Be1gciA8lek7/+o9pw+Ok2P58MwqqGf?= =?us-ascii?Q?w4FWR2BgYvfXBIKqfxsgM7zXCQ2IKJPNQt9X2UriplPTaS1LYD8UHhO1acgJ?= =?us-ascii?Q?2k8jR6ltGm26UOCkc8frqNz05iBKTFRqPSY7riA13UETIC6qhf3+zO6oQnu9?= =?us-ascii?Q?CKKKARifS9NzjtcEFhemKgLbfABWGAga8L0zyygghXl0RMoMOauAUKasf2DU?= =?us-ascii?Q?fULvj/W0Iv2Kna6zDZRSnCH/AE6HccMzCf7ftjUgQyWiLPltRVAa8sCHtrnU?= =?us-ascii?Q?pMaJZwfmvd+CEQ=3D?= X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB2259; 6:jMbNL12xbk7LQ0TJy2QIGYgYCHtq2LoG0pNo2/cMwnz9XTpotD2n/h1Z4GVTH0IpSKbHDwtkonb5O+YVyW/3dvXPfjuwXjqYLwHVsNuSyAG3D2wsUU1cEankcZkwSe52hoTJ3A7wNihNdFRj81fCRGqSMN+TFlw7bLtBRfu2cwAuSF4/kM0Eu1/WzZp722Gs8qlcG/FOPQ4zUOoe3TCka0Bhb1b4+uLBWUcVtXnpQoFTOjRamF3i8fsfxOer4GzABIocAZJk2cv0NXoNrPLpiLZyqxZT9GBU8t+wkA3M3AN+zkNAux6tg79ZMPEYAiw6UoOcnh7McGQKwDrvQTUOfg==; 5:gynEk4svgXqSZ8jOyzXJInYo3pDBCNTZT6QUDIzGY9/4ekx7RLoO7B3OSp7IZuHEhFfwqgD6Evrtz0sJRG+HYxkIRWan6Gj3DGvmUCHDI6zAvQ05m/1OZH2iJ+NMj3OQtUphQJXrfhdBJy5zJJC10Q==; 24:a3iPSte7mcHHAReV7iU7djbLxd7tTC+2n43d7zzPzlpDb3ats07PORQPkoBmLo1/ZaQizuZJUb4ITfaQZtiqJ3PbCxPjHREeXf03510Ky+8=; 7:Nkvu7fek4l3U3uKExqa3o7X/qP6ahz/AtaTHiOhKEmqa4mqT1PfHdzN+qxfVEyTkOmgoNbgZzJdHRGvpuYbGBEfxnhCpF8u1n8Uw8tlnm+hucwgBhnrLM4WOuMic+/x4nRx88+8zsbBkcSIwES8e2S6iElWmplWfQwKyW1f8ondXFvJm6MxbUH7YrjgWMKdY+AEM0QhBxSpvxmB57lgnZQHCw9hJLE4/AcXrlmJkJp8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2017 10:51:39.1097 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB2259 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.37.62 Subject: [Qemu-devel] [PATCH v3 1/2] target/arm/kvm: Translate the MSI doorbell in kvm_arch_fixup_msi_route X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: wei@redhat.com, kevin.tian@intel.com, Bharat Bhushan , marc.zyngier@arm.com, tn@semihalf.com, will.deacon@arm.com, drjones@redhat.com, robin.murphy@arm.com, christoffer.dall@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Translate msi address if device is behind virtio-iommu. This logic is similar to vSMMUv3/Intel iommu emulation. This RFC patch does not handle the case where both vsmmuv3 and virtio-iommu are available. Signed-off-by: Eric Auger Signed-off-by: Bharat Bhushan --- v2->v3: - Rebased to on top of 2.10-rc0 and especially [PATCH qemu v9 0/2] memory/iommu: QOM'fy IOMMU MemoryRegion v1-v2: - Added trace events - removed vSMMU3 link in patch description target/arm/kvm.c | 27 +++++++++++++++++++++++++++ target/arm/trace-events | 3 +++ 2 files changed, 30 insertions(+) diff --git a/target/arm/kvm.c b/target/arm/kvm.c index 7c17f0d..0219c9d 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -21,7 +21,11 @@ #include "kvm_arm.h" #include "cpu.h" #include "internals.h" +#include "trace.h" #include "hw/arm/arm.h" +#include "hw/pci/pci.h" +#include "hw/pci/msi.h" +#include "hw/virtio/virtio-iommu.h" #include "exec/memattrs.h" #include "exec/address-spaces.h" #include "hw/boards.h" @@ -662,6 +666,29 @@ int kvm_arm_vgic_probe(void) int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route, uint64_t address, uint32_t data, PCIDevice *d= ev) { + AddressSpace *as =3D pci_device_iommu_address_space(dev); + IOMMUTLBEntry entry; + IOMMUDevice *sdev; + IOMMUMemoryRegionClass *imrc; + + if (as =3D=3D &address_space_memory) { + return 0; + } + + /* MSI doorbell address is translated by an IOMMU */ + sdev =3D container_of(as, IOMMUDevice, as); + + imrc =3D memory_region_get_iommu_class_nocheck(&sdev->iommu_mr); + + entry =3D imrc->translate(&sdev->iommu_mr, address, IOMMU_WO); + + route->u.msi.address_lo =3D entry.translated_addr; + route->u.msi.address_hi =3D entry.translated_addr >> 32; + + trace_kvm_arm_fixup_msi_route(address, sdev->devfn, + sdev->iommu_mr.parent_obj.name, + entry.translated_addr); + return 0; } =20 diff --git a/target/arm/trace-events b/target/arm/trace-events index e21c84f..eff2822 100644 --- a/target/arm/trace-events +++ b/target/arm/trace-events @@ -8,3 +8,6 @@ arm_gt_tval_write(int timer, uint64_t value) "gt_tval_write= : timer %d value %" P arm_gt_ctl_write(int timer, uint64_t value) "gt_ctl_write: timer %d value = %" PRIx64 arm_gt_imask_toggle(int timer, int irqstate) "gt_ctl_write: timer %d IMASK= toggle, new irqstate %d" arm_gt_cntvoff_write(uint64_t value) "gt_cntvoff_write: value %" PRIx64 + +# target/arm/kvm.c +kvm_arm_fixup_msi_route(uint64_t iova, uint32_t devid, const char *name, u= int64_t gpa) "MSI addr =3D 0x%"PRIx64" is translated for devfn=3D%d through= %s into 0x%"PRIx64 --=20 1.9.3 From nobody Fri May 3 03:20:16 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 15033128662738.18988866258735; Mon, 21 Aug 2017 03:54:26 -0700 (PDT) Received: from localhost ([::1]:33128 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1djkLh-0007tM-2w for importer@patchew.org; Mon, 21 Aug 2017 06:54:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33172) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1djkJL-0006Mf-Ai for qemu-devel@nongnu.org; Mon, 21 Aug 2017 06:52:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1djkJG-00028q-9O for qemu-devel@nongnu.org; Mon, 21 Aug 2017 06:51:59 -0400 Received: from mail-sn1nam01on0048.outbound.protection.outlook.com ([104.47.32.48]:48038 helo=NAM01-SN1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1djkJF-000286-VS; Mon, 21 Aug 2017 06:51:54 -0400 Received: from BN6PR03CA0080.namprd03.prod.outlook.com (10.164.122.146) by CO2PR03MB2264.namprd03.prod.outlook.com (10.166.92.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1362.18; Mon, 21 Aug 2017 10:51:51 +0000 Received: from BL2FFO11FD011.protection.gbl (2a01:111:f400:7c09::129) by BN6PR03CA0080.outlook.office365.com (2603:10b6:405:6f::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1362.18 via Frontend Transport; Mon, 21 Aug 2017 10:51:50 +0000 Received: from tx30smr01.am.freescale.net (192.88.168.50) by BL2FFO11FD011.mail.protection.outlook.com (10.173.161.17) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1341.15 via Frontend Transport; Mon, 21 Aug 2017 10:51:45 +0000 Received: from localhost.localdomain.ap.freescale.net ([10.232.14.21]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v7LApQtE004847; Mon, 21 Aug 2017 03:51:39 -0700 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; From: Bharat Bhushan To: , , , , , , Date: Mon, 21 Aug 2017 16:18:54 +0530 Message-ID: <1503312534-6642-3-git-send-email-Bharat.Bhushan@nxp.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1503312534-6642-1-git-send-email-Bharat.Bhushan@nxp.com> References: <1503312534-6642-1-git-send-email-Bharat.Bhushan@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131477863105707380; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39380400002)(39860400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(53936002)(36756003)(47776003)(104016004)(8656003)(305945005)(105606002)(106466001)(50466002)(68736007)(48376002)(72206003)(54906002)(39060400002)(2201001)(85426001)(7416002)(626005)(86362001)(76176999)(5003940100001)(5890100001)(498600001)(50986999)(97736004)(189998001)(2906002)(5660300001)(4326008)(6666003)(2950100002)(77096006)(50226002)(356003)(8676002)(81166006)(81156014)(8936002)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:CO2PR03MB2264; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD011; 1:XyFC/3z9P9B9cZM2ko2gXeITTbdN2nZ23V8ScMOfytdrip050/tLSg4gLTAOjQ36yhh8Kas/p/Gyw8HF8C6C1v+eWt6sWPHt89NVzwly7Ke9zkxpJzXo5ZJdqqZfwdPX MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 307dcbc7-e4f3-4ec2-3d74-08d4e882a0b5 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603157)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:CO2PR03MB2264; X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2264; 3:OhrJ0Bm0kK4k5xY0nV05V4Lmnd0+odVOs62io0nqmnLaNNnpbcPFe7hI4MFW3trwzBGu65M58rN74Ni8S+svLtmjV/7mhC3Pvr1JYx++9xqvM9FG2isCu9xITVWA3nonsnAoXI4MBRi8T7in7mteKSaKnVSUm2V49k9kcVpvtFeux7VWrSqFFNcTKM0oBS4eXYnqi2koneVP7ydu4441gwwGEvapIt5llii/IDGLYeATQJeGdBXiRcAhR53WCqbHVOs0d4ClZ/kS4bj0kID5wnfPuoNT5QEfinDL8bQtXW4bzGxlHd1vfaFzcxLUpRYmHBY9WHAKnXM0948tx4V2Rf1Zmkg8sI/tQaeO8jMYtCI=; 25:QQOMMfa24mgX+NGx6uR8emTn3Mo9K5qwsmydyVmQASp04efu9WF/tAuAg1HSuAFYPfACiefjwVGRrM9ZeHACKqsScV0P3I7f8nOTo2ZDeHT2aT/uAcl0dznpVebnNvxHmaqeznQG7BolBVL8C9BjTt7RdjaKbRx09WIJzBxU3VxwHlxz50oeR7xM7cz14IcuvBzrSckbIRgn/oCb75m/EZRGiBYG60ZFGlJypz/pWu7mqWoIEs1L8vlLCqXKdb7el6RQ1y1eK52dlyn4psQKt6cqQnKl23vdXWeraJH3j8r3no1B6mDgvjwEFop7x4/epiUi+rPe+LcOPmPu/5S5jw== X-MS-TrafficTypeDiagnostic: CO2PR03MB2264: X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2264; 31:uMlEZVxnx7Kk9Qxdx/Ne5ejM6wHdO+7Tgqbd4VPsi3dk4Rw9gmXcFh3KOruB0XWJJ4+ZKaxGeL+utzXPixqHtwRXTichz/wWBlgqhCe7m1XClMFx2iiWMPG12vOQj1wocggOOKqIjdnBiscnK5Q4AaVCcchf4zgB7Wa7si/jy6l7wYlrRJgOeABvupY/3rjiP6RXTchNp6MoHnj2GF6vI73J97AK07cAXmuAxuFnHOQ=; 4:J4y6l3YBtd9BGN4kMT6wVrWgyh1e09PdWdDLDZKKv+sDVkV+4cdUcOoeQPP/19HtQGvJQA9UuBiq0kIG7Zq80+IAsK1Y7dHSWWfY6OvzFYUi3vZvbX9HFKCJS/uHEitkOdcWMoS+gLoQdRHTuyeAVcCUP1wYMsyTPTUwkyMEZ1LEENzJ1oCJcRyX7Xun38RW83yXtlF5sjpUMcao2DNCzfLrtV8Ck2g0SLOxIkw7RNTNKRI/UZn1nGhA/z7Ge8QWDGT2Ptt1bJ/PfPw3ZNVYHTekZQG+EGznpydKp1hynefNVovN70E7thXaaA/4lX9ls6P4lU8DhFQQ3VIhhFwXEQ== X-Exchange-Antispam-Report-Test: UriScan:(190756311086443)(185117386973197); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(601004)(2401047)(8121501046)(5005006)(13018025)(13016025)(10201501046)(100000703101)(100105400095)(93006095)(93001095)(3002001)(6055026)(6096035)(20161123561025)(20161123559100)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(20161123565025)(20161123563025)(20161123556025)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CO2PR03MB2264; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CO2PR03MB2264; X-Forefront-PRVS: 040655413E X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CO2PR03MB2264; 23:/43XxJ6vBCcbYD/AgYH838cPm+LV3CuOgNVos/v/f?= =?us-ascii?Q?SdjRUCP+0I6gTruuqFqkesJYDx77rzxR54NKX/0fzTQ/mDyO7WFkX5vMljiT?= =?us-ascii?Q?oRcWV1ngNSEbrhT5/8rR6tSSUtL7PGwAN/PQnJrumA5henRLpnMmJZpP97+E?= =?us-ascii?Q?xSlAhcinB18ZDrkLevqT5Xd3f/0sBha56Nxxi8FjWqIvmk2/bRI6UGQrS/tB?= =?us-ascii?Q?5ZYkQvJRlMFe9CGdyebV/Qn4an2KSNTtmuccMoOd6sC90pWLBxw2qMvbkMW5?= =?us-ascii?Q?u5KA3cHetS6TlqlTH31XhGCZUEfKFd4MW1+3J1UyGRNzVOkh/BvlSRdGpCYt?= =?us-ascii?Q?Vbb5dv1aWc0cIw6CBQ92CO5iryKNGI8d4bIdEB8v55M/QJwq7Denjhljssy0?= =?us-ascii?Q?zqvWB4Imse//WlYYrjyWwfehMmdHsyRtKbvjyITfJ4tc280MzwLyg3UGkdjA?= =?us-ascii?Q?DelKnvDS4ei7mA+LIoV/78BdmOW0mClvXPGS0zqFtSn4K1q147whrGI5TPiz?= =?us-ascii?Q?s9NADZXd4c3gv/2HR13rfPMq1ycUcCVmyBfqZyPzeyn4YK0ez9DW0LXgStsz?= =?us-ascii?Q?vJfdiP+cjJ73UKhGZ1AT/idEbcRn7TqULEJMnvvKMgTCATD6d2/XhlcVJLAL?= =?us-ascii?Q?d+zezJbCiEVy5gvQjw47g/BN96aLFyRuMSTa7PEGIpyn/JjJ06K/kczOo/W4?= =?us-ascii?Q?MghUBH3r80OZc0j/8V6D2khtLlmqOBETU84ApJ5gKsfV47KRaI8CE9uvpiNP?= =?us-ascii?Q?UG7Mv3MxnzNWzZlVlG4nD9Qa3z43QMko3cWTi/c7W2u6du4/uO+J/4wSFmIq?= =?us-ascii?Q?Vxhob+PaQCuh+5cffS0+qq/rgqSt95kojj0vG675UJK0l4Qa6z3zR4BlMaOT?= =?us-ascii?Q?+vMSlsRHvCBOYlkqolfDANE20zZOWjNSi+EYy+pd+ehLet03ziqCwsu5LlM9?= =?us-ascii?Q?NVAq0++Qfo9Lyu+RFqRCPYeYEBDzpXh5kTspzl4lBiDlsjKy+aky61kmi7+i?= =?us-ascii?Q?/lpxByAzHpumvNC71HWLfeMpvVu0RNs3v7KNt7AeCFiHgMHmd0Xs0m6DSYCR?= =?us-ascii?Q?yWls1LFtse0oiQCyczXiPt2fYdOjn54WT/k/7/o7sLdnoabGvgU4kZSpezhA?= =?us-ascii?Q?T2iXFgJIyrQSrj6rOkK/4B/6AZo0iZwzPDLcIlF+usA3wyYzWr1LuCZy07XL?= =?us-ascii?Q?JfE8i4tbHPkw/Y=3D?= X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2264; 6:hQX8Vzz66kpnsRZhOYP2PAikEB4L1F+7J1Ka6cQPDr1pIGpSFRCZcQocVJ2i9/flzz13BIOY4oCD77A0+A8N7JWSCSMAmbWOqUfeXOxIgYXozk0MScOXMpcsZm8lQc3EXy+lZcIM9OfvJA2PVV/y3b5jmJjMbKGSIvWOEL2TjuBp3aJ23JhWpfBUXMA1pVgZQu+DE/xTTitmxq5ELl1RYD0P2S8kfeariSKXu1PMsHd1szD+8Yew86urcOqGcKRrHOdrRABGaNRsWNj7Zsy/G7TghzVzOL7dVvGMLX8qmrPgS7mRYiYbXFMVIUmSrhFx/SePDCITHIc/6HTQZr0JTw==; 5:hWrQdF6M61UUlzHsVQe2vH7Rq3LgZ7DDmayQ+xJ3sziBCr038NcpU8h2qGm2wI2veBWx9zCuJCGGEiU5Kadq1X5nRBiTEM1ssZC7nJ70jEkkvYhBZ9bhRMuryySLbiTLWgWtZZLSLbNCITuMMsTrOw==; 24:QpnGobGGpBnRei9qxHkF8dIQ4zfaJ+hVVzSKb/iMY3RDFi/dtcjX0cwVy9RG5DuBjBQU+xm9sQS63XwPv+ShYQdgDgdoj/iK1luFiTEm0eQ=; 7:xUr3/fgSEYe2FMGsTE4zcc49TSvF8naHG0bVhlmHNFIZY9R0KHsPYnH2wUQ0OekxHNXqpkuwRaNTBYTv3TC7rluW68aanPINwsI/ZgQfn7PqjEtg9BD2VpRFBnMDktbVdvalNVw7qvzARljJm+ghCTRurxJHsSrqzZ/gPwWya1x9sGr8nO+qv62mv4TMINKxt3nopnOyemAFImYofc4nW9jyHPoWuiRXx6+MjWXQZrI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2017 10:51:45.3291 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO2PR03MB2264 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.32.48 Subject: [Qemu-devel] [PATCH v3 2/2] virtio-iommu: vfio integration with virtio-iommu X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: wei@redhat.com, kevin.tian@intel.com, Bharat Bhushan , marc.zyngier@arm.com, tn@semihalf.com, will.deacon@arm.com, drjones@redhat.com, robin.murphy@arm.com, christoffer.dall@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This RFC patch allows virtio-iommu protection for PCI device-passthrough. MSI region is mapped by current version of virtio-iommu driver. This uses VFIO extension of map/unmap notification when an area of memory is mappedi/unmapped in emulated iommu device. This series is tested with 2 PCI devices to virtual machine using dma-ops and DPDK in VM is not yet tested. Also with this series we observe below prints for MSI region mapping "qemu-system-aarch64: iommu map to non memory area 0" This print comes when vfio/map-notifier is called for MSI region. vfio map/unmap notification is called for given device This assumes that devid passed in virtio_iommu_attach is same as devfn This assumption is based on 1:1 mapping of requested-id with device-id in QEMU. Signed-off-by: Bharat Bhushan --- v2->v3: - Addressed review comments: - virtio-iommu_map_region function is split in two functions virtio_iommu_notify_map/virtio_iommu_notify_unmap - use size received from driver and do not split in 4K pages =20 - map/unmap notification is called for given device/as This relies on devid passed in virtio_iommu_attach is same as devfn This is assumed as iommu-map maps 1:1 requested-id to device-id in QEMU Looking for comment about this assumtion. - Keeping track devices in address-space - Verified with 2 PCI endpoints - some code cleanup hw/virtio/trace-events | 5 ++ hw/virtio/virtio-iommu.c | 163 +++++++++++++++++++++++++++++++++++= ++++ include/hw/virtio/virtio-iommu.h | 6 ++ 3 files changed, 174 insertions(+) diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events index 8db3d91..7e9663f 100644 --- a/hw/virtio/trace-events +++ b/hw/virtio/trace-events @@ -39,3 +39,8 @@ virtio_iommu_unmap_left_interval(uint64_t low, uint64_t h= igh, uint64_t next_low, virtio_iommu_unmap_right_interval(uint64_t low, uint64_t high, uint64_t ne= xt_low, uint64_t next_high) "Unmap right [0x%"PRIx64",0x%"PRIx64"], new int= erval=3D[0x%"PRIx64",0x%"PRIx64"]" virtio_iommu_unmap_inc_interval(uint64_t low, uint64_t high) "Unmap inc [0= x%"PRIx64",0x%"PRIx64"]" virtio_iommu_translate_result(uint64_t virt_addr, uint64_t phys_addr, uint= 32_t sid) "0x%"PRIx64" -> 0x%"PRIx64 " for sid=3D%d" +virtio_iommu_notify_flag_add(const char *iommu) "Add virtio-iommu notifier= node for memory region %s" +virtio_iommu_notify_flag_del(const char *iommu) "Del virtio-iommu notifier= node for memory region %s" +virtio_iommu_remap(hwaddr iova, hwaddr pa, hwaddr size) "iova=3D0x%"PRIx64= " pa=3D0x%" PRIx64" size=3D0x%"PRIx64"" +virtio_iommu_notify_map(hwaddr iova, hwaddr paddr, hwaddr map_size) "iova= =3D0x%"PRIx64" pa=3D0x%" PRIx64" size=3D0x%"PRIx64"" +virtio_iommu_notify_unmap(hwaddr iova, hwaddr paddr, hwaddr map_size) "iov= a=3D0x%"PRIx64" pa=3D0x%" PRIx64" size=3D0x%"PRIx64"" diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c index 9217587..9eae050 100644 --- a/hw/virtio/virtio-iommu.c +++ b/hw/virtio/virtio-iommu.c @@ -55,11 +55,13 @@ typedef struct viommu_interval { typedef struct viommu_dev { uint32_t id; viommu_as *as; + QLIST_ENTRY(viommu_dev) next; } viommu_dev; =20 struct viommu_as { uint32_t id; GTree *mappings; + QLIST_HEAD(, viommu_dev) device_list; }; =20 static inline uint16_t virtio_iommu_get_sid(IOMMUDevice *dev) @@ -133,12 +135,70 @@ static gint interval_cmp(gconstpointer a, gconstpoint= er b, gpointer user_data) } } =20 +static void virtio_iommu_notify_map(IOMMUMemoryRegion *mr, hwaddr iova, + hwaddr paddr, hwaddr size) +{ + IOMMUTLBEntry entry; + + entry.target_as =3D &address_space_memory; + entry.addr_mask =3D size - 1; + + entry.iova =3D iova; + trace_virtio_iommu_notify_map(iova, paddr, size); + entry.perm =3D IOMMU_RW; + entry.translated_addr =3D paddr; + + memory_region_notify_iommu(mr, entry); +} + +static void virtio_iommu_notify_unmap(IOMMUMemoryRegion *mr, hwaddr iova, + hwaddr paddr, hwaddr size) +{ + IOMMUTLBEntry entry; + + entry.target_as =3D &address_space_memory; + entry.addr_mask =3D size - 1; + + entry.iova =3D iova; + trace_virtio_iommu_notify_unmap(iova, paddr, size); + entry.perm =3D IOMMU_NONE; + entry.translated_addr =3D 0; + + memory_region_notify_iommu(mr, entry); +} + +static gboolean virtio_iommu_maping_unmap(gpointer key, gpointer value, + gpointer data) +{ + viommu_mapping *mapping =3D (viommu_mapping *) value; + IOMMUMemoryRegion *mr =3D (IOMMUMemoryRegion *) data; + + virtio_iommu_notify_unmap(mr, mapping->virt_addr, 0, mapping->size); + + return true; +} + static void virtio_iommu_detach_dev(VirtIOIOMMU *s, viommu_dev *dev) { + VirtioIOMMUNotifierNode *node; viommu_as *as =3D dev->as; + int devid =3D dev->id; =20 trace_virtio_iommu_detach(dev->id); =20 + /* Remove device from address-space list */ + QLIST_REMOVE(dev, next); + /* unmap all if no devices attached to address-spaceRemove */ + if (QLIST_EMPTY(&as->device_list)) { + QLIST_FOREACH(node, &s->notifiers_list, next) { + if (devid =3D=3D node->iommu_dev->devfn) { + g_tree_foreach(as->mappings, virtio_iommu_maping_unmap, + &node->iommu_dev->iommu_mr); + } + } + } + + /* Remove device from global list */ g_tree_remove(s->devices, GUINT_TO_POINTER(dev->id)); g_tree_unref(as->mappings); } @@ -171,6 +231,7 @@ static int virtio_iommu_attach(VirtIOIOMMU *s, if (!as) { as =3D g_malloc0(sizeof(*as)); as->id =3D asid; + QLIST_INIT(&as->device_list); as->mappings =3D g_tree_new_full((GCompareDataFunc)interval_cmp, NULL, NULL, (GDestroyNotify)g_fre= e); g_tree_insert(s->address_spaces, GUINT_TO_POINTER(asid), as); @@ -182,6 +243,7 @@ static int virtio_iommu_attach(VirtIOIOMMU *s, dev->id =3D devid; trace_virtio_iommu_new_devid(devid); g_tree_insert(s->devices, GUINT_TO_POINTER(devid), dev); + QLIST_INSERT_HEAD(&as->device_list, dev, next); g_tree_ref(as->mappings); =20 return VIRTIO_IOMMU_S_OK; @@ -219,6 +281,8 @@ static int virtio_iommu_map(VirtIOIOMMU *s, viommu_as *as; viommu_interval *interval; viommu_mapping *mapping; + VirtioIOMMUNotifierNode *node; + viommu_dev *dev; =20 interval =3D g_malloc0(sizeof(*interval)); =20 @@ -230,6 +294,11 @@ static int virtio_iommu_map(VirtIOIOMMU *s, return VIRTIO_IOMMU_S_NOENT; } =20 + dev =3D QLIST_FIRST(&as->device_list); + if (!dev) { + return VIRTIO_IOMMU_S_NOENT; + } + mapping =3D g_tree_lookup(as->mappings, (gpointer)interval); if (mapping) { g_free(interval); @@ -246,6 +315,14 @@ static int virtio_iommu_map(VirtIOIOMMU *s, =20 g_tree_insert(as->mappings, interval, mapping); =20 + /* All devices in an address-space share mapping */ + QLIST_FOREACH(node, &s->notifiers_list, next) { + if (dev->id =3D=3D node->iommu_dev->devfn) { + virtio_iommu_notify_map(&node->iommu_dev->iommu_mr, virt_addr, + phys_addr, size); + } + } + return VIRTIO_IOMMU_S_OK; } =20 @@ -259,6 +336,8 @@ static int virtio_iommu_unmap(VirtIOIOMMU *s, viommu_mapping *mapping; viommu_interval interval; viommu_as *as; + VirtioIOMMUNotifierNode *node; + viommu_dev *dev; =20 trace_virtio_iommu_unmap(asid, virt_addr, size, flags); =20 @@ -267,6 +346,12 @@ static int virtio_iommu_unmap(VirtIOIOMMU *s, error_report("%s: no as", __func__); return VIRTIO_IOMMU_S_NOENT; } + + dev =3D QLIST_FIRST(&as->device_list); + if (!dev) { + return VIRTIO_IOMMU_S_NOENT; + } + interval.low =3D virt_addr; interval.high =3D virt_addr + size - 1; =20 @@ -296,7 +381,15 @@ static int virtio_iommu_unmap(VirtIOIOMMU *s, } else { break; } + if (interval.low >=3D interval.high) { + /* All devices in an address-space share mapping */ + QLIST_FOREACH(node, &s->notifiers_list, next) { + if (dev->id =3D=3D node->iommu_dev->devfn) { + virtio_iommu_notify_unmap(&node->iommu_dev->iommu_mr, = virt_addr, + 0, size); + } + } return VIRTIO_IOMMU_S_OK; } else { mapping =3D g_tree_lookup(as->mappings, (gpointer)&interval); @@ -439,6 +532,36 @@ static void virtio_iommu_handle_command(VirtIODevice *= vdev, VirtQueue *vq) } } =20 +static void virtio_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu_mr, + IOMMUNotifierFlag old, + IOMMUNotifierFlag new) +{ + IOMMUDevice *sdev =3D container_of(iommu_mr, IOMMUDevice, iommu_mr); + VirtIOIOMMU *s =3D sdev->viommu; + VirtioIOMMUNotifierNode *node =3D NULL; + VirtioIOMMUNotifierNode *next_node =3D NULL; + + if (old =3D=3D IOMMU_NOTIFIER_NONE) { + trace_virtio_iommu_notify_flag_add(iommu_mr->parent_obj.name); + node =3D g_malloc0(sizeof(*node)); + node->iommu_dev =3D sdev; + QLIST_INSERT_HEAD(&s->notifiers_list, node, next); + return; + } + + /* update notifier node with new flags */ + QLIST_FOREACH_SAFE(node, &s->notifiers_list, next, next_node) { + if (node->iommu_dev =3D=3D sdev) { + if (new =3D=3D IOMMU_NOTIFIER_NONE) { + trace_virtio_iommu_notify_flag_del(iommu_mr->parent_obj.na= me); + QLIST_REMOVE(node, next); + g_free(node); + } + return; + } + } +} + static IOMMUTLBEntry virtio_iommu_translate(IOMMUMemoryRegion *mr, hwaddr = addr, IOMMUAccessFlags flag) { @@ -553,11 +676,49 @@ static gint int_cmp(gconstpointer a, gconstpointer b,= gpointer user_data) return (ua > ub) - (ua < ub); } =20 +static gboolean virtio_iommu_remap(gpointer key, gpointer value, gpointer = data) +{ + viommu_mapping *mapping =3D (viommu_mapping *) value; + IOMMUMemoryRegion *mr =3D (IOMMUMemoryRegion *) data; + + trace_virtio_iommu_remap(mapping->virt_addr, mapping->phys_addr, + mapping->size); + /* unmap previous entry and map again */ + virtio_iommu_notify_unmap(mr, mapping->virt_addr, 0, mapping->size); + + virtio_iommu_notify_map(mr, mapping->virt_addr, mapping->phys_addr, + mapping->size); + return true; +} + +static void virtio_iommu_replay(IOMMUMemoryRegion *mr, IOMMUNotifier *n) +{ + IOMMUDevice *sdev =3D container_of(mr, IOMMUDevice, iommu_mr); + VirtIOIOMMU *s =3D sdev->viommu; + uint32_t sid; + viommu_dev *dev; + + sid =3D virtio_iommu_get_sid(sdev); + + qemu_mutex_lock(&s->mutex); + + dev =3D g_tree_lookup(s->devices, GUINT_TO_POINTER(sid)); + if (!dev) { + goto unlock; + } + + g_tree_foreach(dev->as->mappings, virtio_iommu_remap, mr); + +unlock: + qemu_mutex_unlock(&s->mutex); +} + static void virtio_iommu_device_realize(DeviceState *dev, Error **errp) { VirtIODevice *vdev =3D VIRTIO_DEVICE(dev); VirtIOIOMMU *s =3D VIRTIO_IOMMU(dev); =20 + QLIST_INIT(&s->notifiers_list); virtio_init(vdev, "virtio-iommu", VIRTIO_ID_IOMMU, sizeof(struct virtio_iommu_config)); =20 @@ -644,6 +805,8 @@ static void virtio_iommu_memory_region_class_init(Objec= tClass *klass, IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_CLASS(klass); =20 imrc->translate =3D virtio_iommu_translate; + imrc->notify_flag_changed =3D virtio_iommu_notify_flag_changed; + imrc->replay =3D virtio_iommu_replay; } =20 static const TypeInfo virtio_iommu_info =3D { diff --git a/include/hw/virtio/virtio-iommu.h b/include/hw/virtio/virtio-io= mmu.h index f9c988f..7e04184 100644 --- a/include/hw/virtio/virtio-iommu.h +++ b/include/hw/virtio/virtio-iommu.h @@ -46,6 +46,11 @@ typedef struct IOMMUPciBus { IOMMUDevice *pbdev[0]; /* Parent array is sparse, so dynamically allo= c */ } IOMMUPciBus; =20 +typedef struct VirtioIOMMUNotifierNode { + IOMMUDevice *iommu_dev; + QLIST_ENTRY(VirtioIOMMUNotifierNode) next; +} VirtioIOMMUNotifierNode; + typedef struct VirtIOIOMMU { VirtIODevice parent_obj; VirtQueue *vq; @@ -56,6 +61,7 @@ typedef struct VirtIOIOMMU { GTree *address_spaces; QemuMutex mutex; GTree *devices; + QLIST_HEAD(, VirtioIOMMUNotifierNode) notifiers_list; } VirtIOIOMMU; =20 #endif --=20 1.9.3