From nobody Fri Apr 26 05:04:27 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1557321938; cv=none; d=zoho.com; s=zohoarc; b=etxqotNhc6xiYpWwIG43whi6Bm66ZtjSBfvBwHEtolhCIABBaRLW4XByzkt6foI80OHnmCarEYZ8N6orf7klf7YO7I323q4eNabwGWpLCVB0OFmYiXkl9GXjg1Zhiw4bfFmbrX+u2pm/A0WBXqupWr5wUwVYgbrMGj6IOiHNi7Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557321938; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=1Zwe9XT3yHbe/UUAfMl+45kkwTNTECfhXg3eGwsc2XY=; b=Om51i0BgRcR+/Yx08+IW6dRCL9zpyce6hA+6XrqMssTNG5sWZZaDZdyJ6yW9SE+wSR9+YEK2TNrmkVAJeWLV+RiRYdrjHrjkLkQkEM2gOMnUXc3MaiS3071Q1Aos5tjlplPUQPJXT+8pjotxHu3q7weL1rFkEIKDSZnWb+YPxDc= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1557321938758381.10150118978015; Wed, 8 May 2019 06:25:38 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hOMYT-0000eQ-Aa; Wed, 08 May 2019 13:24:17 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hOMYS-0000dd-1B for xen-devel@lists.xenproject.org; Wed, 08 May 2019 13:24:16 +0000 Received: from SMTP03.CITRIX.COM (unknown [162.221.156.55]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 92bddcd7-7194-11e9-843c-bc764e045a96; Wed, 08 May 2019 13:24:14 +0000 (UTC) X-Inumbo-ID: 92bddcd7-7194-11e9-843c-bc764e045a96 X-IronPort-AV: E=Sophos;i="5.60,446,1549929600"; d="scan'208";a="85265438" From: Paul Durrant To: Date: Wed, 8 May 2019 14:24:01 +0100 Message-ID: <20190508132403.1454-4-paul.durrant@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190508132403.1454-1-paul.durrant@citrix.com> References: <20190508132403.1454-1-paul.durrant@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 3/5] iommu: move iommu_get_ops() into common code X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Kevin Tian , Stefano Stabellini , Wei Liu , Suravee Suthikulpanit , Andrew Cooper , Julien Grall , Paul Durrant , Jan Beulich , Brian Woods , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Currently x86 and ARM differ in their implementation for no good reason. This patch moves the ARM variant of iommu_get/set_ops() helpers into common code and modifies them so they deal with the __initconstrel ops structures used by the x86 IOMMU vendor implementations (adding __initconstrel to the SMMU code to bring it in line). Consequently, a lack of init() method is now taken to mean uninitialized iommu_ops. Also, the printk warning in iommu_set_ops() now becomes an ASSERT. NOTE: This patch also gets rid of the extern intel_iommu_ops as it is no longer necessary. Signed-off-by: Paul Durrant --- Cc: Suravee Suthikulpanit Cc: Brian Woods Cc: Stefano Stabellini Cc: Julien Grall Cc: Jan Beulich Cc: Kevin Tian Cc: Andrew Cooper Cc: Wei Liu Cc: "Roger Pau Monn=C3=A9" --- xen/drivers/passthrough/arm/iommu.c | 17 ----------------- xen/drivers/passthrough/arm/smmu.c | 2 +- xen/drivers/passthrough/iommu.c | 15 +++++++++++++++ xen/drivers/passthrough/vtd/extern.h | 1 - xen/drivers/passthrough/vtd/iommu.c | 4 ++-- xen/drivers/passthrough/x86/iommu.c | 16 +++++++--------- xen/include/asm-arm/iommu.h | 3 --- xen/include/asm-x86/iommu.h | 20 ++++++++------------ xen/include/xen/iommu.h | 3 +++ 9 files changed, 36 insertions(+), 45 deletions(-) diff --git a/xen/drivers/passthrough/arm/iommu.c b/xen/drivers/passthrough/= arm/iommu.c index 325997b19f..c226ed18e3 100644 --- a/xen/drivers/passthrough/arm/iommu.c +++ b/xen/drivers/passthrough/arm/iommu.c @@ -20,23 +20,6 @@ #include #include =20 -static const struct iommu_ops *iommu_ops; - -const struct iommu_ops *iommu_get_ops(void) -{ - return iommu_ops; -} - -void __init iommu_set_ops(const struct iommu_ops *ops) -{ - BUG_ON(ops =3D=3D NULL); - - if ( iommu_ops && iommu_ops !=3D ops ) - printk("WARNING: Cannot set IOMMU ops, already set to a different = value\n"); - - iommu_ops =3D ops; -} - int __init iommu_hardware_setup(void) { struct dt_device_node *np; diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/a= rm/smmu.c index f151b9f5b5..f01061a218 100644 --- a/xen/drivers/passthrough/arm/smmu.c +++ b/xen/drivers/passthrough/arm/smmu.c @@ -1989,7 +1989,7 @@ static int arm_smmu_domain_set_attr(struct iommu_doma= in *domain, } } =20 -static const struct iommu_ops arm_smmu_ops =3D { +static const struct iommu_ops __initconstrel arm_smmu_ops =3D { .capable =3D arm_smmu_capable, .domain_init =3D arm_smmu_domain_init, .domain_destroy =3D arm_smmu_domain_destroy, diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iomm= u.c index b453b32191..d3a6199b77 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -21,6 +21,21 @@ #include #include =20 +static struct iommu_ops __read_mostly iommu_ops; + +const struct iommu_ops *iommu_get_ops(void) +{ + return &iommu_ops; +} + +void __init iommu_set_ops(const struct iommu_ops *ops) +{ + BUG_ON(!ops); + + ASSERT(!iommu_ops.init || iommu_ops.init =3D=3D ops->init); + iommu_ops =3D *ops; +} + static void iommu_dump_p2m_table(unsigned char key); =20 unsigned int __read_mostly iommu_dev_iotlb_timeout =3D 1000; diff --git a/xen/drivers/passthrough/vtd/extern.h b/xen/drivers/passthrough= /vtd/extern.h index 331d6e64f7..0ae5ddf6d0 100644 --- a/xen/drivers/passthrough/vtd/extern.h +++ b/xen/drivers/passthrough/vtd/extern.h @@ -28,7 +28,6 @@ struct pci_ats_dev; extern bool_t rwbf_quirk; extern const struct iommu_init_ops intel_iommu_init_ops; -extern const struct iommu_ops intel_iommu_ops; =20 void print_iommu_regs(struct acpi_drhd_unit *drhd); void print_vtd_entries(struct iommu *iommu, int bus, int devfn, u64 gmfn); diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/= vtd/iommu.c index f9c76f594c..db77655260 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -2700,7 +2700,7 @@ static void vtd_dump_p2m_table(struct domain *d) vtd_dump_p2m_table_level(hd->arch.pgd_maddr, agaw_to_level(hd->arch.ag= aw), 0, 0); } =20 -const struct iommu_ops __initconstrel intel_iommu_ops =3D { +static const struct iommu_ops __initconstrel _iommu_ops =3D { .init =3D intel_iommu_domain_init, .hwdom_init =3D intel_iommu_hwdom_init, .add_device =3D intel_iommu_add_device, @@ -2733,7 +2733,7 @@ const struct iommu_ops __initconstrel intel_iommu_ops= =3D { }; =20 const struct iommu_init_ops __initconstrel intel_iommu_init_ops =3D { - .ops =3D &intel_iommu_ops, + .ops =3D &_iommu_ops, .setup =3D vtd_setup, .supports_x2apic =3D intel_iommu_supports_eim, }; diff --git a/xen/drivers/passthrough/x86/iommu.c b/xen/drivers/passthrough/= x86/iommu.c index 895c7fb564..d9eaf1e62b 100644 --- a/xen/drivers/passthrough/x86/iommu.c +++ b/xen/drivers/passthrough/x86/iommu.c @@ -24,7 +24,6 @@ #include =20 const struct iommu_init_ops *__initdata iommu_init_ops; -struct iommu_ops __read_mostly iommu_ops; =20 int __init iommu_hardware_setup(void) { @@ -33,11 +32,7 @@ int __init iommu_hardware_setup(void) if ( !iommu_init_ops ) return -ENODEV; =20 - if ( !iommu_ops.init ) - iommu_ops =3D *iommu_init_ops->ops; - else - /* x2apic setup may have previously initialised the struct. */ - ASSERT(iommu_ops.init =3D=3D iommu_init_ops->ops->init); + iommu_set_ops(iommu_init_ops->ops); =20 rc =3D iommu_init_ops->setup(); =20 @@ -49,20 +44,23 @@ int __init iommu_hardware_setup(void) =20 int iommu_enable_x2apic(void) { + const struct iommu_ops *ops; + if ( system_state < SYS_STATE_active ) { if ( !iommu_supports_x2apic() ) return -EOPNOTSUPP; =20 - iommu_ops =3D *iommu_init_ops->ops; + iommu_set_ops(iommu_init_ops->ops); } else if ( !x2apic_enabled ) return -EOPNOTSUPP; =20 - if ( !iommu_ops.enable_x2apic ) + ops =3D iommu_get_ops(); + if ( !ops->enable_x2apic ) return -EOPNOTSUPP; =20 - return iommu_ops.enable_x2apic(); + return ops->enable_x2apic(); } =20 void iommu_update_ire_from_apic( diff --git a/xen/include/asm-arm/iommu.h b/xen/include/asm-arm/iommu.h index 904c9aec11..fb4ca23b69 100644 --- a/xen/include/asm-arm/iommu.h +++ b/xen/include/asm-arm/iommu.h @@ -23,9 +23,6 @@ struct arch_iommu /* Always share P2M Table between the CPU and the IOMMU */ #define iommu_use_hap_pt(d) (has_iommu_pt(d)) =20 -const struct iommu_ops *iommu_get_ops(void); -void iommu_set_ops(const struct iommu_ops *ops); - #endif /* __ARCH_ARM_IOMMU_H__ */ =20 /* diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h index bbdb05f5f0..2d8716d673 100644 --- a/xen/include/asm-x86/iommu.h +++ b/xen/include/asm-x86/iommu.h @@ -57,14 +57,6 @@ struct arch_iommu struct guest_iommu *g_iommu; }; =20 -extern struct iommu_ops iommu_ops; - -static inline const struct iommu_ops *iommu_get_ops(void) -{ - BUG_ON(!iommu_ops.init); - return &iommu_ops; -} - struct iommu_init_ops { const struct iommu_ops *ops; int (*setup)(void); @@ -83,8 +75,10 @@ int iommu_setup_hpet_msi(struct msi_desc *); =20 static inline int iommu_adjust_irq_affinities(void) { - return iommu_ops.adjust_irq_affinities - ? iommu_ops.adjust_irq_affinities() + const struct iommu_ops *ops =3D iommu_get_ops(); + + return ops->adjust_irq_affinities + ? ops->adjust_irq_affinities() : 0; } =20 @@ -103,8 +97,10 @@ int iommu_enable_x2apic(void); =20 static inline void iommu_disable_x2apic(void) { - if ( x2apic_enabled && iommu_ops.disable_x2apic ) - iommu_ops.disable_x2apic(); + const struct iommu_ops *ops =3D iommu_get_ops(); + + if ( x2apic_enabled && ops->disable_x2apic ) + ops->disable_x2apic(); } =20 extern bool untrusted_msi; diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index 5d3c1619c4..b2d429a6ef 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -64,6 +64,9 @@ extern int8_t iommu_hwdom_reserved; =20 extern unsigned int iommu_dev_iotlb_timeout; =20 +const struct iommu_ops *iommu_get_ops(void); +void iommu_set_ops(const struct iommu_ops *ops); + int iommu_setup(void); int iommu_hardware_setup(void); =20 --=20 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel