From: "Anna, Suman" <s-anna-l0cyMroinI0@public.gmane.org>
To: "Florian Vaussard"
<florian.vaussard-p8DiymsW2f8@public.gmane.org>,
"Joerg Roedel" <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>,
"Tony Lindgren" <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>,
"Benoît Cousson"
<bcousson-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
Cc: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
"devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Pawel Moll <pawel.moll-5wv7dgnIgG8@public.gmane.org>,
Ian Campbell
<ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org>,
"linux-doc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-doc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>,
"iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org"
<iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>,
Rob Landley <rob-VoJi6FS/r0vR7s880joybQ@public.gmane.org>,
Kumar Gala <galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
Grant Likely
<grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
"linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
"linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org"
<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>
Subject: Re: [PATCH 1/7] iommu/omap: Do bus_set_iommu() only if probe() succeeds
Date: Mon, 23 Dec 2013 13:02:26 -0600 [thread overview]
Message-ID: <52B888C2.8040303@ti.com> (raw)
In-Reply-To: <1387284818-28739-2-git-send-email-florian.vaussard-p8DiymsW2f8@public.gmane.org>
Hi Florian,
On 12/17/2013 06:53 AM, Florian Vaussard wrote:
> Currently, bus_set_iommu() is done in omap_iommu_init(). However,
> omap_iommu_probe() can fail in a number of ways, leaving the platform
> bus with a dangling reference to a non-initialized iommu. Perform
> bus_set_iommu() only if omap_iommu_probe() succeed.
Can you clarify a bit more on what kind of issues you were seeing
specifically? In general, there can be multiple instances of the iommu,
so setting it in probe may not be fixing whatever issue you were seeing.
The current OMAP3 code has only the ISP MMU enabled, but there is also
another one for the IVA MMU (currently not configured by default).
Moving the bus_set_iommu to probe makes sense if only one iommu is
present, so this patch may not be needed at all.
Also, the main change in this patch is moving the bus_set_iommu from
omap_iommu_init to omap_iommu_probe, so you should probably leave out
moving the function. The omap_iommu_probe function would anyway need
conversion to using devm_ functions.
regards
Suman
>
> Signed-off-by: Florian Vaussard <florian.vaussard-p8DiymsW2f8@public.gmane.org>
> ---
> drivers/iommu/omap-iommu.c | 207 +++++++++++++++++++++++----------------------
> 1 file changed, 104 insertions(+), 103 deletions(-)
>
> diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c
> index bcd78a7..ee83bcc 100644
> --- a/drivers/iommu/omap-iommu.c
> +++ b/drivers/iommu/omap-iommu.c
> @@ -930,107 +930,6 @@ static void omap_iommu_detach(struct omap_iommu *obj)
> dev_dbg(obj->dev, "%s: %s\n", __func__, obj->name);
> }
>
> -/*
> - * OMAP Device MMU(IOMMU) detection
> - */
> -static int omap_iommu_probe(struct platform_device *pdev)
> -{
> - int err = -ENODEV;
> - int irq;
> - struct omap_iommu *obj;
> - struct resource *res;
> - struct iommu_platform_data *pdata = pdev->dev.platform_data;
> -
> - obj = kzalloc(sizeof(*obj) + MMU_REG_SIZE, GFP_KERNEL);
> - if (!obj)
> - return -ENOMEM;
> -
> - obj->nr_tlb_entries = pdata->nr_tlb_entries;
> - obj->name = pdata->name;
> - obj->dev = &pdev->dev;
> - obj->ctx = (void *)obj + sizeof(*obj);
> - obj->da_start = pdata->da_start;
> - obj->da_end = pdata->da_end;
> -
> - spin_lock_init(&obj->iommu_lock);
> - mutex_init(&obj->mmap_lock);
> - spin_lock_init(&obj->page_table_lock);
> - INIT_LIST_HEAD(&obj->mmap);
> -
> - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> - if (!res) {
> - err = -ENODEV;
> - goto err_mem;
> - }
> -
> - res = request_mem_region(res->start, resource_size(res),
> - dev_name(&pdev->dev));
> - if (!res) {
> - err = -EIO;
> - goto err_mem;
> - }
> -
> - obj->regbase = ioremap(res->start, resource_size(res));
> - if (!obj->regbase) {
> - err = -ENOMEM;
> - goto err_ioremap;
> - }
> -
> - irq = platform_get_irq(pdev, 0);
> - if (irq < 0) {
> - err = -ENODEV;
> - goto err_irq;
> - }
> - err = request_irq(irq, iommu_fault_handler, IRQF_SHARED,
> - dev_name(&pdev->dev), obj);
> - if (err < 0)
> - goto err_irq;
> - platform_set_drvdata(pdev, obj);
> -
> - pm_runtime_irq_safe(obj->dev);
> - pm_runtime_enable(obj->dev);
> -
> - dev_info(&pdev->dev, "%s registered\n", obj->name);
> - return 0;
> -
> -err_irq:
> - iounmap(obj->regbase);
> -err_ioremap:
> - release_mem_region(res->start, resource_size(res));
> -err_mem:
> - kfree(obj);
> - return err;
> -}
> -
> -static int omap_iommu_remove(struct platform_device *pdev)
> -{
> - int irq;
> - struct resource *res;
> - struct omap_iommu *obj = platform_get_drvdata(pdev);
> -
> - iopgtable_clear_entry_all(obj);
> -
> - irq = platform_get_irq(pdev, 0);
> - free_irq(irq, obj);
> - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> - release_mem_region(res->start, resource_size(res));
> - iounmap(obj->regbase);
> -
> - pm_runtime_disable(obj->dev);
> -
> - dev_info(&pdev->dev, "%s removed\n", obj->name);
> - kfree(obj);
> - return 0;
> -}
> -
> -static struct platform_driver omap_iommu_driver = {
> - .probe = omap_iommu_probe,
> - .remove = omap_iommu_remove,
> - .driver = {
> - .name = "omap-iommu",
> - },
> -};
> -
> static void iopte_cachep_ctor(void *iopte)
> {
> clean_dcache_area(iopte, IOPTE_TABLE_SIZE);
> @@ -1265,6 +1164,110 @@ static struct iommu_ops omap_iommu_ops = {
> .pgsize_bitmap = OMAP_IOMMU_PGSIZES,
> };
>
> +/*
> + * OMAP Device MMU(IOMMU) detection
> + */
> +static int omap_iommu_probe(struct platform_device *pdev)
> +{
> + int err = -ENODEV;
> + int irq;
> + struct omap_iommu *obj;
> + struct resource *res;
> + struct iommu_platform_data *pdata = pdev->dev.platform_data;
> +
> + obj = kzalloc(sizeof(*obj) + MMU_REG_SIZE, GFP_KERNEL);
> + if (!obj)
> + return -ENOMEM;
> +
> + obj->nr_tlb_entries = pdata->nr_tlb_entries;
> + obj->name = pdata->name;
> + obj->dev = &pdev->dev;
> + obj->ctx = (void *)obj + sizeof(*obj);
> + obj->da_start = pdata->da_start;
> + obj->da_end = pdata->da_end;
> +
> + spin_lock_init(&obj->iommu_lock);
> + mutex_init(&obj->mmap_lock);
> + spin_lock_init(&obj->page_table_lock);
> + INIT_LIST_HEAD(&obj->mmap);
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!res) {
> + err = -ENODEV;
> + goto err_mem;
> + }
> +
> + res = request_mem_region(res->start, resource_size(res),
> + dev_name(&pdev->dev));
> + if (!res) {
> + err = -EIO;
> + goto err_mem;
> + }
> +
> + obj->regbase = ioremap(res->start, resource_size(res));
> + if (!obj->regbase) {
> + err = -ENOMEM;
> + goto err_ioremap;
> + }
> +
> + irq = platform_get_irq(pdev, 0);
> + if (irq < 0) {
> + err = -ENODEV;
> + goto err_irq;
> + }
> +
> + err = request_irq(irq, iommu_fault_handler, IRQF_SHARED,
> + dev_name(&pdev->dev), obj);
> + if (err < 0)
> + goto err_irq;
> + platform_set_drvdata(pdev, obj);
> +
> + bus_set_iommu(&platform_bus_type, &omap_iommu_ops);
> +
> + pm_runtime_irq_safe(obj->dev);
> + pm_runtime_enable(obj->dev);
> +
> + dev_info(&pdev->dev, "%s registered\n", obj->name);
> + return 0;
> +
> +err_irq:
> + iounmap(obj->regbase);
> +err_ioremap:
> + release_mem_region(res->start, resource_size(res));
> +err_mem:
> + kfree(obj);
> + return err;
> +}
> +
> +static int omap_iommu_remove(struct platform_device *pdev)
> +{
> + int irq;
> + struct resource *res;
> + struct omap_iommu *obj = platform_get_drvdata(pdev);
> +
> + iopgtable_clear_entry_all(obj);
> +
> + irq = platform_get_irq(pdev, 0);
> + free_irq(irq, obj);
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + release_mem_region(res->start, resource_size(res));
> + iounmap(obj->regbase);
> +
> + pm_runtime_disable(obj->dev);
> +
> + dev_info(&pdev->dev, "%s removed\n", obj->name);
> + kfree(obj);
> + return 0;
> +}
> +
> +static struct platform_driver omap_iommu_driver = {
> + .probe = omap_iommu_probe,
> + .remove = omap_iommu_remove,
> + .driver = {
> + .name = "omap-iommu",
> + },
> +};
> +
> static int __init omap_iommu_init(void)
> {
> struct kmem_cache *p;
> @@ -1277,8 +1280,6 @@ static int __init omap_iommu_init(void)
> return -ENOMEM;
> iopte_cachep = p;
>
> - bus_set_iommu(&platform_bus_type, &omap_iommu_ops);
> -
> return platform_driver_register(&omap_iommu_driver);
> }
> /* must be ready before omap3isp is probed */
>
next prev parent reply other threads:[~2013-12-23 19:02 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-17 12:53 [PATCH 0/7] Fix omap-iommu probe and convert to DT for 3.14 Florian Vaussard
2013-12-17 12:53 ` [PATCH 1/7] iommu/omap: Do bus_set_iommu() only if probe() succeeds Florian Vaussard
[not found] ` <1387284818-28739-2-git-send-email-florian.vaussard-p8DiymsW2f8@public.gmane.org>
2013-12-23 19:02 ` Anna, Suman [this message]
[not found] ` <52B888C2.8040303-l0cyMroinI0@public.gmane.org>
2013-12-23 21:07 ` Florian Vaussard
[not found] ` <52B8A5F8.3000706-p8DiymsW2f8@public.gmane.org>
2013-12-23 23:35 ` Anna, Suman
[not found] ` <52B8C8C1.8080101-l0cyMroinI0@public.gmane.org>
2014-01-15 17:12 ` Florian Vaussard
2013-12-17 12:53 ` [PATCH 2/7] iommu/omap: omap_iommu_attach() should return ENODEV, not NULL Florian Vaussard
[not found] ` <1387284818-28739-3-git-send-email-florian.vaussard-p8DiymsW2f8@public.gmane.org>
2013-12-23 18:45 ` Anna, Suman
2013-12-17 12:53 ` [PATCH 3/7] iommu/omap: Convert to devicetree Florian Vaussard
[not found] ` <1387284818-28739-4-git-send-email-florian.vaussard-p8DiymsW2f8@public.gmane.org>
2013-12-23 19:48 ` Anna, Suman
[not found] ` <52B89394.5060902-l0cyMroinI0@public.gmane.org>
2013-12-23 21:17 ` Florian Vaussard
[not found] ` <52B8A87F.7080100-p8DiymsW2f8@public.gmane.org>
2013-12-23 23:42 ` Anna, Suman
2014-01-02 0:13 ` Laurent Pinchart
2014-01-02 1:01 ` Sebastian Reichel
[not found] ` <20140102010150.GA9933-SfvFxonMDyemK9LvCR3Hrw@public.gmane.org>
2014-01-15 17:16 ` Florian Vaussard
2013-12-17 12:53 ` [PATCH 4/7] iommu/omap: Allow enable/disable even without pdata Florian Vaussard
[not found] ` <1387284818-28739-5-git-send-email-florian.vaussard-p8DiymsW2f8@public.gmane.org>
2013-12-23 19:05 ` Anna, Suman
[not found] ` <52B88990.5020807-l0cyMroinI0@public.gmane.org>
2013-12-23 21:19 ` Florian Vaussard
2013-12-17 12:53 ` [PATCH 5/7] ARM: dts: Complete data for isp iommu Florian Vaussard
[not found] ` <1387284818-28739-6-git-send-email-florian.vaussard-p8DiymsW2f8@public.gmane.org>
2013-12-23 19:12 ` Anna, Suman
[not found] ` <52B88B1A.40506-l0cyMroinI0@public.gmane.org>
2013-12-23 21:34 ` Florian Vaussard
2013-12-24 0:10 ` Anna, Suman
2013-12-17 12:53 ` [PATCH 6/7] ARM: OMAP2+: Remove legacy data from hwmod for omap3 " Florian Vaussard
[not found] ` <1387284818-28739-7-git-send-email-florian.vaussard-p8DiymsW2f8@public.gmane.org>
2013-12-23 19:08 ` Anna, Suman
[not found] ` <52B88A49.9020402-l0cyMroinI0@public.gmane.org>
2013-12-23 21:36 ` Florian Vaussard
[not found] ` <52B8ACED.1030209-p8DiymsW2f8@public.gmane.org>
2013-12-23 23:28 ` Anna, Suman
2013-12-17 12:53 ` [PATCH 7/7] ARM: OMAP2+: Remove platform-specific omap-iommu Florian Vaussard
[not found] ` <1387284818-28739-1-git-send-email-florian.vaussard-p8DiymsW2f8@public.gmane.org>
2013-12-23 18:52 ` [PATCH 0/7] Fix omap-iommu probe and convert to DT for 3.14 Anna, Suman
[not found] ` <52B8866D.9060100-l0cyMroinI0@public.gmane.org>
2013-12-23 20:51 ` Florian Vaussard
[not found] ` <52B8A26A.3000905-p8DiymsW2f8@public.gmane.org>
2013-12-23 23:54 ` Anna, Suman
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=52B888C2.8040303@ti.com \
--to=s-anna-l0cymroini0@public.gmane.org \
--cc=bcousson-rdvid1DuHRBWk0Htik3J/w@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=florian.vaussard-p8DiymsW2f8@public.gmane.org \
--cc=galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-doc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
--cc=pawel.moll-5wv7dgnIgG8@public.gmane.org \
--cc=rob-VoJi6FS/r0vR7s880joybQ@public.gmane.org \
--cc=rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org \
--cc=tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).