From: Eric Auger <eric.auger@redhat.com> To: eric.auger@redhat.com, eric.auger.pro@gmail.com, christoffer.dall@linaro.org, marc.zyngier@arm.com, robin.murphy@arm.com, alex.williamson@redhat.com, will.deacon@arm.com, joro@8bytes.org, tglx@linutronix.de, jason@lakedaemon.net, linux-arm-kernel@lists.infradead.org Cc: kvm@vger.kernel.org, drjones@redhat.com, linux-kernel@vger.kernel.org, Bharat.Bhushan@freescale.com, pranav.sawargaonkar@gmail.com, p.fedin@samsung.com, iommu@lists.linux-foundation.org, Jean-Philippe.Brucker@arm.com, yehuday@marvell.com, Manish.Jaggi@caviumnetworks.com Subject: [PATCH v13 05/15] genirq/msi: msi_doorbell_calc_pages Date: Thu, 6 Oct 2016 08:45:21 +0000 [thread overview] Message-ID: <1475743531-4780-6-git-send-email-eric.auger@redhat.com> (raw) In-Reply-To: <1475743531-4780-1-git-send-email-eric.auger@redhat.com> msi_doorbell_calc_pages() sum up the number of iommu pages of a given order requested to map all the registered doorbells. This function will allow to dimension the intermediate physical address (IPA) aperture requested to map the MSI doorbells. Note this requirement cannot be computed at MSI doorbell registration time since the IOMMU page order is not known. Signed-off-by: Eric Auger <eric.auger@redhat.com> --- v11 -> v12: - fix style issues: remove useless line break, remove pointless braces, fix kernel-doc comments - reword commit message - rename msi_doorbell_pages into msi_doorbell_calc_pages - rename static compute* functions v10: creation --- include/linux/msi-doorbell.h | 15 +++++++++++ kernel/irq/msi-doorbell.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/include/linux/msi-doorbell.h b/include/linux/msi-doorbell.h index c18a382..f1106cb 100644 --- a/include/linux/msi-doorbell.h +++ b/include/linux/msi-doorbell.h @@ -54,6 +54,15 @@ void msi_doorbell_unregister_global(struct msi_doorbell_info *db); */ bool msi_doorbell_safe(void); +/** + * msi_doorbell_calc_pages - compute the number of pages + * requested to map all the registered doorbells + * @order: iommu page order + * + * Return: the number of requested pages + */ +int msi_doorbell_calc_pages(unsigned int order); + #else static inline int @@ -72,6 +81,12 @@ static inline bool msi_doorbell_safe(void) { return true; } + +static inline int msi_doorbell_calc_pages(unsigned int order) +{ + return 0; +} + #endif /* CONFIG_MSI_DOORBELL */ #endif diff --git a/kernel/irq/msi-doorbell.c b/kernel/irq/msi-doorbell.c index 60a262a..d1cc525 100644 --- a/kernel/irq/msi-doorbell.c +++ b/kernel/irq/msi-doorbell.c @@ -96,3 +96,67 @@ bool msi_doorbell_safe(void) return !nb_unsafe_doorbells; } EXPORT_SYMBOL_GPL(msi_doorbell_safe); + +/** + * calc_region_reqs - compute the number of pages requested to map a region + * + * @addr: physical base address of the region + * @size: size of the region + * @order: the page order + * + * Return: the number of requested pages to map this region + */ +static int calc_region_reqs(phys_addr_t addr, size_t size, unsigned int order) +{ + phys_addr_t offset, granule; + unsigned int nb_pages; + + granule = (uint64_t)(1 << order); + offset = addr & (granule - 1); + size = ALIGN(size + offset, granule); + nb_pages = size >> order; + + return nb_pages; +} + +/** + * calc_dbinfo_reqs - compute the number of pages requested to map a given + * MSI doorbell + * + * @dbi: doorbell info descriptor + * @order: page order + * + * Return: the number of requested pages to map this doorbell + */ +static int calc_dbinfo_reqs(struct msi_doorbell_info *dbi, unsigned int order) +{ + int ret = 0; + + if (!dbi->doorbell_is_percpu) { + ret = calc_region_reqs(dbi->global_doorbell, dbi->size, order); + } else { + phys_addr_t __percpu *pbase; + int cpu; + + for_each_possible_cpu(cpu) { + pbase = per_cpu_ptr(dbi->percpu_doorbells, cpu); + ret += calc_region_reqs(*pbase, dbi->size, order); + } + } + return ret; +} + +int msi_doorbell_calc_pages(unsigned int order) +{ + struct msi_doorbell *db; + int ret = 0; + + mutex_lock(&msi_doorbell_mutex); + list_for_each_entry(db, &msi_doorbell_list, next) + ret += calc_dbinfo_reqs(&db->info, order); + + mutex_unlock(&msi_doorbell_mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(msi_doorbell_calc_pages); -- 1.9.1
WARNING: multiple messages have this Message-ID (diff)
From: eric.auger@redhat.com (Eric Auger) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v13 05/15] genirq/msi: msi_doorbell_calc_pages Date: Thu, 6 Oct 2016 08:45:21 +0000 [thread overview] Message-ID: <1475743531-4780-6-git-send-email-eric.auger@redhat.com> (raw) In-Reply-To: <1475743531-4780-1-git-send-email-eric.auger@redhat.com> msi_doorbell_calc_pages() sum up the number of iommu pages of a given order requested to map all the registered doorbells. This function will allow to dimension the intermediate physical address (IPA) aperture requested to map the MSI doorbells. Note this requirement cannot be computed at MSI doorbell registration time since the IOMMU page order is not known. Signed-off-by: Eric Auger <eric.auger@redhat.com> --- v11 -> v12: - fix style issues: remove useless line break, remove pointless braces, fix kernel-doc comments - reword commit message - rename msi_doorbell_pages into msi_doorbell_calc_pages - rename static compute* functions v10: creation --- include/linux/msi-doorbell.h | 15 +++++++++++ kernel/irq/msi-doorbell.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/include/linux/msi-doorbell.h b/include/linux/msi-doorbell.h index c18a382..f1106cb 100644 --- a/include/linux/msi-doorbell.h +++ b/include/linux/msi-doorbell.h @@ -54,6 +54,15 @@ void msi_doorbell_unregister_global(struct msi_doorbell_info *db); */ bool msi_doorbell_safe(void); +/** + * msi_doorbell_calc_pages - compute the number of pages + * requested to map all the registered doorbells + * @order: iommu page order + * + * Return: the number of requested pages + */ +int msi_doorbell_calc_pages(unsigned int order); + #else static inline int @@ -72,6 +81,12 @@ static inline bool msi_doorbell_safe(void) { return true; } + +static inline int msi_doorbell_calc_pages(unsigned int order) +{ + return 0; +} + #endif /* CONFIG_MSI_DOORBELL */ #endif diff --git a/kernel/irq/msi-doorbell.c b/kernel/irq/msi-doorbell.c index 60a262a..d1cc525 100644 --- a/kernel/irq/msi-doorbell.c +++ b/kernel/irq/msi-doorbell.c @@ -96,3 +96,67 @@ bool msi_doorbell_safe(void) return !nb_unsafe_doorbells; } EXPORT_SYMBOL_GPL(msi_doorbell_safe); + +/** + * calc_region_reqs - compute the number of pages requested to map a region + * + * @addr: physical base address of the region + * @size: size of the region + * @order: the page order + * + * Return: the number of requested pages to map this region + */ +static int calc_region_reqs(phys_addr_t addr, size_t size, unsigned int order) +{ + phys_addr_t offset, granule; + unsigned int nb_pages; + + granule = (uint64_t)(1 << order); + offset = addr & (granule - 1); + size = ALIGN(size + offset, granule); + nb_pages = size >> order; + + return nb_pages; +} + +/** + * calc_dbinfo_reqs - compute the number of pages requested to map a given + * MSI doorbell + * + * @dbi: doorbell info descriptor + * @order: page order + * + * Return: the number of requested pages to map this doorbell + */ +static int calc_dbinfo_reqs(struct msi_doorbell_info *dbi, unsigned int order) +{ + int ret = 0; + + if (!dbi->doorbell_is_percpu) { + ret = calc_region_reqs(dbi->global_doorbell, dbi->size, order); + } else { + phys_addr_t __percpu *pbase; + int cpu; + + for_each_possible_cpu(cpu) { + pbase = per_cpu_ptr(dbi->percpu_doorbells, cpu); + ret += calc_region_reqs(*pbase, dbi->size, order); + } + } + return ret; +} + +int msi_doorbell_calc_pages(unsigned int order) +{ + struct msi_doorbell *db; + int ret = 0; + + mutex_lock(&msi_doorbell_mutex); + list_for_each_entry(db, &msi_doorbell_list, next) + ret += calc_dbinfo_reqs(&db->info, order); + + mutex_unlock(&msi_doorbell_mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(msi_doorbell_calc_pages); -- 1.9.1
next prev parent reply other threads:[~2016-10-06 8:46 UTC|newest] Thread overview: 109+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-10-06 8:45 [PATCH v13 00/15] KVM PCIe/MSI passthrough on ARM/ARM64 Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` [PATCH v13 01/15] iommu: Introduce DOMAIN_ATTR_MSI_GEOMETRY Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` [PATCH v13 02/15] iommu/arm-smmu: Initialize the msi geometry Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:16 ` Alex Williamson 2016-10-06 20:16 ` Alex Williamson 2016-10-06 20:16 ` Alex Williamson 2016-10-06 8:45 ` [PATCH v13 03/15] iommu/dma: Allow MSI-only cookies Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:17 ` Alex Williamson 2016-10-06 20:17 ` Alex Williamson 2016-10-06 20:17 ` Alex Williamson 2016-10-07 17:14 ` Auger Eric 2016-10-07 17:14 ` Auger Eric 2016-10-07 17:14 ` Auger Eric 2016-10-10 14:26 ` Robin Murphy 2016-10-10 14:26 ` Robin Murphy 2016-10-10 14:26 ` Robin Murphy 2016-10-10 14:47 ` Auger Eric 2016-10-10 14:47 ` Auger Eric 2016-10-10 14:47 ` Auger Eric 2016-10-10 15:52 ` Robin Murphy 2016-10-10 15:52 ` Robin Murphy 2016-10-10 15:52 ` Robin Murphy 2016-10-06 8:45 ` [PATCH v13 04/15] genirq/msi: Introduce the MSI doorbell API Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:17 ` Alex Williamson 2016-10-06 20:17 ` Alex Williamson 2016-10-07 17:13 ` Auger Eric 2016-10-07 17:13 ` Auger Eric 2016-10-07 17:13 ` Auger Eric 2016-10-06 8:45 ` Eric Auger [this message] 2016-10-06 8:45 ` [PATCH v13 05/15] genirq/msi: msi_doorbell_calc_pages Eric Auger 2016-10-06 8:45 ` [PATCH v13 06/15] irqchip/gic-v2m: Register the MSI doorbell Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` [PATCH v13 07/15] irqchip/gicv3-its: " Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` [PATCH v13 08/15] vfio: Introduce a vfio_dma type field Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:18 ` Alex Williamson 2016-10-06 20:18 ` Alex Williamson 2016-10-06 20:18 ` Alex Williamson 2016-10-06 8:45 ` [PATCH v13 09/15] vfio/type1: vfio_find_dma accepting a type argument Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:18 ` Alex Williamson 2016-10-06 20:18 ` Alex Williamson 2016-10-06 20:18 ` Alex Williamson 2016-10-06 8:45 ` [PATCH v13 10/15] vfio/type1: Implement recursive vfio_find_dma_from_node Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:19 ` Alex Williamson 2016-10-06 20:19 ` Alex Williamson 2016-10-06 20:19 ` Alex Williamson 2016-10-06 8:45 ` [PATCH v13 11/15] vfio/type1: Handle unmap/unpin and replay for VFIO_IOVA_RESERVED slots Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:19 ` Alex Williamson 2016-10-06 20:19 ` Alex Williamson 2016-10-06 20:19 ` Alex Williamson 2016-10-07 17:11 ` Auger Eric 2016-10-07 17:11 ` Auger Eric 2016-10-07 17:11 ` Auger Eric 2016-10-06 8:45 ` [PATCH v13 12/15] vfio: Allow reserved msi iova registration Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:19 ` Alex Williamson 2016-10-06 20:19 ` Alex Williamson 2016-10-06 20:19 ` Alex Williamson 2016-10-07 17:11 ` Auger Eric 2016-10-07 17:11 ` Auger Eric 2016-10-07 17:11 ` Auger Eric 2016-10-07 20:45 ` Alex Williamson 2016-10-07 20:45 ` Alex Williamson 2016-10-07 20:45 ` Alex Williamson 2016-10-06 8:45 ` [PATCH v13 13/15] vfio/type1: Check doorbell safety Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:19 ` Alex Williamson 2016-10-06 20:19 ` Alex Williamson 2016-10-06 20:19 ` Alex Williamson 2016-10-06 8:45 ` [PATCH v13 14/15] iommu/arm-smmu: Do not advertise IOMMU_CAP_INTR_REMAP Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` [PATCH v13 15/15] vfio/type1: Return the MSI geometry through VFIO_IOMMU_GET_INFO capability chains Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 8:45 ` Eric Auger 2016-10-06 20:20 ` Alex Williamson 2016-10-06 20:20 ` Alex Williamson 2016-10-06 20:20 ` Alex Williamson 2016-10-06 20:42 ` Alex Williamson 2016-10-06 20:42 ` Alex Williamson 2016-10-06 20:42 ` Alex Williamson 2016-10-07 17:10 ` Auger Eric 2016-10-07 17:10 ` Auger Eric 2016-10-07 17:10 ` Auger Eric 2016-10-07 20:38 ` Alex Williamson 2016-10-07 20:38 ` Alex Williamson 2016-10-07 20:38 ` Alex Williamson 2016-10-10 15:01 ` Auger Eric 2016-10-10 15:01 ` Auger Eric
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=1475743531-4780-6-git-send-email-eric.auger@redhat.com \ --to=eric.auger@redhat.com \ --cc=Bharat.Bhushan@freescale.com \ --cc=Jean-Philippe.Brucker@arm.com \ --cc=Manish.Jaggi@caviumnetworks.com \ --cc=alex.williamson@redhat.com \ --cc=christoffer.dall@linaro.org \ --cc=drjones@redhat.com \ --cc=eric.auger.pro@gmail.com \ --cc=iommu@lists.linux-foundation.org \ --cc=jason@lakedaemon.net \ --cc=joro@8bytes.org \ --cc=kvm@vger.kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=marc.zyngier@arm.com \ --cc=p.fedin@samsung.com \ --cc=pranav.sawargaonkar@gmail.com \ --cc=robin.murphy@arm.com \ --cc=tglx@linutronix.de \ --cc=will.deacon@arm.com \ --cc=yehuday@marvell.com \ /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: linkBe 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.