From: Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
To: Hiroshi DOYU <hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linaro-mm-sig-bounces-cunTk1MwBs8s++Sfvej+rw@public.gmane.org
Subject: Re: [PATCH 2/2] ARM: IOMMU: Tegra30: Add iommu_ops for SMMU driver
Date: Mon, 23 Jan 2012 16:43:10 +0100 [thread overview]
Message-ID: <20120123154310.GC6269@8bytes.org> (raw)
In-Reply-To: <1325747509-29665-3-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Hi,
please see my comments inline. When you fix these issues I think the
driver is ready for merging.
On Thu, Jan 05, 2012 at 09:11:49AM +0200, Hiroshi DOYU wrote:
> +static int smmu_iommu_map(struct iommu_domain *domain, unsigned long iova,
> + phys_addr_t pa, size_t bytes, int prot)
> +{
> + struct smmu_as *as = domain->priv;
> + unsigned long pfn = __phys_to_pfn(pa);
> + unsigned long flags;
> +
> + dev_dbg(as->smmu->dev, "[%d] %08lx:%08x\n", as->asid, iova, pa);
> +
> + if (!pfn_valid(pfn))
> + return -ENOMEM;
> +
> + spin_lock_irqsave(&as->lock, flags);
> + __smmu_iommu_map_pfn(as, iova, pfn);
> + spin_unlock_irqrestore(&as->lock, flags);
> + return 0;
Why do you completly ignore the size parameter in this function (and
in the unmap part below)?
According to the page-sizes you export to the generic layer size can be
4k or 4M. You need to take care of that in this function.
> +static void smmu_iommu_domain_destroy(struct iommu_domain *domain)
> +{
> + struct smmu_as *as = domain->priv;
> + struct smmu_device *smmu = as->smmu;
> + unsigned long flags;
> +
> + spin_lock_irqsave(&as->lock, flags);
> +
> + if (as->pdir_page) {
> + spin_lock(&smmu->lock);
> + smmu_write(smmu, SMMU_PTB_ASID_CUR(as->asid), SMMU_PTB_ASID);
> + smmu_write(smmu, SMMU_PTB_DATA_RESET_VAL, SMMU_PTB_DATA);
> + FLUSH_SMMU_REGS(smmu);
> + spin_unlock(&smmu->lock);
> +
> + free_pdir(as);
> + }
> +
> + if (!list_empty(&as->client)) {
> + struct smmu_client *c;
> +
> + list_for_each_entry(c, &as->client, list)
> + dev_err(smmu->dev,
> + "%s is still attached\n", dev_name(c->dev));
This is not an error. Just detach the devices when they are still
attached to the domain.
> + }
> +
> + spin_unlock_irqrestore(&as->lock, flags);
> +
> + domain->priv = NULL;
> + dev_dbg(smmu->dev, "smmu_as@%p\n", as);
> +}
> +
> +static int smmu_iommu_attach_dev(struct iommu_domain *domain,
> + struct device *dev)
> +{
> + struct smmu_as *as = domain->priv;
> + struct smmu_device *smmu = as->smmu;
Hmm, this looks like there is a 1-1 mapping between hardware SMMU
devices and domains. This is not consistent with IOMMU-API semantics
where a domain can contain devices behind different SMMUs. Please fix
that.
Thanks,
Joerg
WARNING: multiple messages have this Message-ID (diff)
From: joro@8bytes.org (Joerg Roedel)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] ARM: IOMMU: Tegra30: Add iommu_ops for SMMU driver
Date: Mon, 23 Jan 2012 16:43:10 +0100 [thread overview]
Message-ID: <20120123154310.GC6269@8bytes.org> (raw)
In-Reply-To: <1325747509-29665-3-git-send-email-hdoyu@nvidia.com>
Hi,
please see my comments inline. When you fix these issues I think the
driver is ready for merging.
On Thu, Jan 05, 2012 at 09:11:49AM +0200, Hiroshi DOYU wrote:
> +static int smmu_iommu_map(struct iommu_domain *domain, unsigned long iova,
> + phys_addr_t pa, size_t bytes, int prot)
> +{
> + struct smmu_as *as = domain->priv;
> + unsigned long pfn = __phys_to_pfn(pa);
> + unsigned long flags;
> +
> + dev_dbg(as->smmu->dev, "[%d] %08lx:%08x\n", as->asid, iova, pa);
> +
> + if (!pfn_valid(pfn))
> + return -ENOMEM;
> +
> + spin_lock_irqsave(&as->lock, flags);
> + __smmu_iommu_map_pfn(as, iova, pfn);
> + spin_unlock_irqrestore(&as->lock, flags);
> + return 0;
Why do you completly ignore the size parameter in this function (and
in the unmap part below)?
According to the page-sizes you export to the generic layer size can be
4k or 4M. You need to take care of that in this function.
> +static void smmu_iommu_domain_destroy(struct iommu_domain *domain)
> +{
> + struct smmu_as *as = domain->priv;
> + struct smmu_device *smmu = as->smmu;
> + unsigned long flags;
> +
> + spin_lock_irqsave(&as->lock, flags);
> +
> + if (as->pdir_page) {
> + spin_lock(&smmu->lock);
> + smmu_write(smmu, SMMU_PTB_ASID_CUR(as->asid), SMMU_PTB_ASID);
> + smmu_write(smmu, SMMU_PTB_DATA_RESET_VAL, SMMU_PTB_DATA);
> + FLUSH_SMMU_REGS(smmu);
> + spin_unlock(&smmu->lock);
> +
> + free_pdir(as);
> + }
> +
> + if (!list_empty(&as->client)) {
> + struct smmu_client *c;
> +
> + list_for_each_entry(c, &as->client, list)
> + dev_err(smmu->dev,
> + "%s is still attached\n", dev_name(c->dev));
This is not an error. Just detach the devices when they are still
attached to the domain.
> + }
> +
> + spin_unlock_irqrestore(&as->lock, flags);
> +
> + domain->priv = NULL;
> + dev_dbg(smmu->dev, "smmu_as@%p\n", as);
> +}
> +
> +static int smmu_iommu_attach_dev(struct iommu_domain *domain,
> + struct device *dev)
> +{
> + struct smmu_as *as = domain->priv;
> + struct smmu_device *smmu = as->smmu;
Hmm, this looks like there is a 1-1 mapping between hardware SMMU
devices and domains. This is not consistent with IOMMU-API semantics
where a domain can contain devices behind different SMMUs. Please fix
that.
Thanks,
Joerg
WARNING: multiple messages have this Message-ID (diff)
From: Joerg Roedel <joro@8bytes.org>
To: Hiroshi DOYU <hdoyu@nvidia.com>
Cc: iommu@lists.linux-foundation.org,
linux-arm-kernel@lists.infradead.org,
linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org,
linaro-mm-sig-bounces@lists.linaro.org
Subject: Re: [PATCH 2/2] ARM: IOMMU: Tegra30: Add iommu_ops for SMMU driver
Date: Mon, 23 Jan 2012 16:43:10 +0100 [thread overview]
Message-ID: <20120123154310.GC6269@8bytes.org> (raw)
In-Reply-To: <1325747509-29665-3-git-send-email-hdoyu@nvidia.com>
Hi,
please see my comments inline. When you fix these issues I think the
driver is ready for merging.
On Thu, Jan 05, 2012 at 09:11:49AM +0200, Hiroshi DOYU wrote:
> +static int smmu_iommu_map(struct iommu_domain *domain, unsigned long iova,
> + phys_addr_t pa, size_t bytes, int prot)
> +{
> + struct smmu_as *as = domain->priv;
> + unsigned long pfn = __phys_to_pfn(pa);
> + unsigned long flags;
> +
> + dev_dbg(as->smmu->dev, "[%d] %08lx:%08x\n", as->asid, iova, pa);
> +
> + if (!pfn_valid(pfn))
> + return -ENOMEM;
> +
> + spin_lock_irqsave(&as->lock, flags);
> + __smmu_iommu_map_pfn(as, iova, pfn);
> + spin_unlock_irqrestore(&as->lock, flags);
> + return 0;
Why do you completly ignore the size parameter in this function (and
in the unmap part below)?
According to the page-sizes you export to the generic layer size can be
4k or 4M. You need to take care of that in this function.
> +static void smmu_iommu_domain_destroy(struct iommu_domain *domain)
> +{
> + struct smmu_as *as = domain->priv;
> + struct smmu_device *smmu = as->smmu;
> + unsigned long flags;
> +
> + spin_lock_irqsave(&as->lock, flags);
> +
> + if (as->pdir_page) {
> + spin_lock(&smmu->lock);
> + smmu_write(smmu, SMMU_PTB_ASID_CUR(as->asid), SMMU_PTB_ASID);
> + smmu_write(smmu, SMMU_PTB_DATA_RESET_VAL, SMMU_PTB_DATA);
> + FLUSH_SMMU_REGS(smmu);
> + spin_unlock(&smmu->lock);
> +
> + free_pdir(as);
> + }
> +
> + if (!list_empty(&as->client)) {
> + struct smmu_client *c;
> +
> + list_for_each_entry(c, &as->client, list)
> + dev_err(smmu->dev,
> + "%s is still attached\n", dev_name(c->dev));
This is not an error. Just detach the devices when they are still
attached to the domain.
> + }
> +
> + spin_unlock_irqrestore(&as->lock, flags);
> +
> + domain->priv = NULL;
> + dev_dbg(smmu->dev, "smmu_as@%p\n", as);
> +}
> +
> +static int smmu_iommu_attach_dev(struct iommu_domain *domain,
> + struct device *dev)
> +{
> + struct smmu_as *as = domain->priv;
> + struct smmu_device *smmu = as->smmu;
Hmm, this looks like there is a 1-1 mapping between hardware SMMU
devices and domains. This is not consistent with IOMMU-API semantics
where a domain can contain devices behind different SMMUs. Please fix
that.
Thanks,
Joerg
next prev parent reply other threads:[~2012-01-23 15:43 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-05 7:11 [PATCH v3 0/2] ARM: IOMMU: tegra: Add iommu_ops for GART/SMMU driver Hiroshi DOYU
2012-01-05 7:11 ` Hiroshi DOYU
2012-01-05 7:11 ` Hiroshi DOYU
2012-01-05 7:11 ` [PATCH 1/2] ARM: IOMMU: Tegra20: Add iommu_ops for GART driver Hiroshi DOYU
2012-01-05 7:11 ` Hiroshi DOYU
[not found] ` <1325747509-29665-2-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-23 15:00 ` Joerg Roedel
2012-01-23 15:00 ` Joerg Roedel
2012-01-23 15:00 ` Joerg Roedel
[not found] ` <20120123150048.GB6269-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2012-01-25 7:40 ` Hiroshi Doyu
2012-01-25 7:40 ` Hiroshi Doyu
2012-01-25 7:40 ` Hiroshi Doyu
[not found] ` <20120125.094020.983282777619146490.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-26 11:58 ` joro-zLv9SwRftAIdnm+yROfE0A
2012-01-26 11:58 ` joro
2012-01-26 11:58 ` joro at 8bytes.org
[not found] ` <20120126115813.GF6269-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2012-01-26 14:45 ` Hiroshi Doyu
2012-01-26 14:45 ` Hiroshi Doyu
2012-01-26 14:45 ` Hiroshi Doyu
2012-01-05 7:11 ` [PATCH 2/2] ARM: IOMMU: Tegra30: Add iommu_ops for SMMU driver Hiroshi DOYU
2012-01-05 7:11 ` Hiroshi DOYU
[not found] ` <1325747509-29665-3-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-23 15:43 ` Joerg Roedel [this message]
2012-01-23 15:43 ` Joerg Roedel
2012-01-23 15:43 ` Joerg Roedel
[not found] ` <20120123154310.GC6269-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2012-01-24 9:57 ` Hiroshi Doyu
2012-01-24 9:57 ` Hiroshi Doyu
2012-01-24 9:57 ` Hiroshi Doyu
[not found] ` <20120124.115701.2179509760878976509.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-24 11:04 ` Joerg Roedel
2012-01-24 11:04 ` Joerg Roedel
2012-01-24 11:04 ` Joerg Roedel
[not found] ` <20120124110444.GB19255-5C7GfCeVMHo@public.gmane.org>
2012-01-24 11:36 ` Hiroshi Doyu
2012-01-24 11:36 ` Hiroshi Doyu
2012-01-24 11:36 ` Hiroshi Doyu
[not found] ` <20120124.133614.1646093482547685131.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-24 11:57 ` joerg.roedel-5C7GfCeVMHo
2012-01-24 11:57 ` joerg.roedel
2012-01-24 11:57 ` joerg.roedel at amd.com
[not found] ` <20120124115723.GC19255-5C7GfCeVMHo@public.gmane.org>
2012-01-24 12:07 ` Hiroshi Doyu
2012-01-24 12:07 ` Hiroshi Doyu
2012-01-24 12:07 ` Hiroshi Doyu
2012-01-24 13:41 ` Hiroshi Doyu
2012-01-24 13:41 ` Hiroshi Doyu
2012-01-24 13:41 ` Hiroshi Doyu
[not found] ` <20120124.154121.1062920821192552748.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-24 13:46 ` Felipe Balbi
2012-01-24 13:46 ` Felipe Balbi
2012-01-24 13:46 ` Felipe Balbi
[not found] ` <20120124134601.GT27414-UiBtZHVXSwEVvW8u9ZQWYwjfymiNCTlR@public.gmane.org>
2012-01-24 14:25 ` joro-zLv9SwRftAIdnm+yROfE0A
2012-01-24 14:25 ` joro
2012-01-24 14:25 ` joro at 8bytes.org
[not found] ` <20120124142521.GE6269-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2012-01-25 7:39 ` Hiroshi Doyu
2012-01-25 7:39 ` Hiroshi Doyu
2012-01-25 7:39 ` Hiroshi Doyu
[not found] ` <20120125.093932.783007031082378997.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-26 14:59 ` joro-zLv9SwRftAIdnm+yROfE0A
2012-01-26 14:59 ` joro
2012-01-26 14:59 ` joro at 8bytes.org
[not found] ` <1325747509-29665-1-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-05 7:17 ` [PATCH v3 0/2] ARM: IOMMU: tegra: Add iommu_ops for GART/SMMU driver Hiroshi Doyu
2012-01-05 7:17 ` Hiroshi Doyu
2012-01-05 7:17 ` Hiroshi Doyu
[not found] ` <20120105091718.3fb378b2a1d390f9dd63c396-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-05 12:53 ` Russell King - ARM Linux
2012-01-05 12:53 ` Russell King - ARM Linux
2012-01-05 12:53 ` Russell King - ARM Linux
[not found] ` <20120105125326.GT11810-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2012-01-05 14:29 ` Hiroshi Doyu
2012-01-05 14:29 ` Hiroshi Doyu
2012-01-05 14:29 ` Hiroshi Doyu
[not found] ` <20120105.162930.604365154868332443.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-01-05 14:46 ` Russell King - ARM Linux
2012-01-05 14:46 ` Russell King - ARM Linux
2012-01-05 14:46 ` Russell King - ARM Linux
[not found] ` <20120105144631.GV11810-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2012-01-11 14:24 ` Hiroshi Doyu
2012-01-11 14:24 ` Hiroshi Doyu
2012-01-11 14:24 ` Hiroshi Doyu
2012-01-09 0:39 ` KyongHo Cho
2012-01-09 0:39 ` KyongHo Cho
2012-01-09 11:45 ` Russell King - ARM Linux
2012-01-09 11:45 ` Russell King - ARM Linux
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=20120123154310.GC6269@8bytes.org \
--to=joro-zlv9swrftaidnm+yrofe0a@public.gmane.org \
--cc=hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=linaro-mm-sig-bounces-cunTk1MwBs8s++Sfvej+rw@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@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 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.