From: Jerome Glisse <j.glisse@gmail.com>
To: Oded Gabbay <oded.gabbay@amd.com>
Cc: "David Airlie" <airlied@linux.ie>,
"Alex Deucher" <alexdeucher@gmail.com>,
"Andrew Morton" <akpm@linux-foundation.org>,
"John Bridgman" <John.Bridgman@amd.com>,
"Joerg Roedel" <joro@8bytes.org>,
"Andrew Lewycky" <Andrew.Lewycky@amd.com>,
"Christian König" <deathsimple@vodafone.de>,
"Michel Dänzer" <michel.daenzer@amd.com>,
"Ben Goz" <Ben.Goz@amd.com>,
"Alexey Skidanov" <Alexey.Skidanov@amd.com>,
"Evgeny Pinchuk" <Evgeny.Pinchuk@amd.com>,
"Alex Deucher" <alexander.deucher@amd.com>,
"Christian König" <christian.koenig@amd.com>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 12/25] amdkfd: Add binding/unbinding calls to amd_iommu driver
Date: Sun, 20 Jul 2014 19:04:27 -0400 [thread overview]
Message-ID: <20140720230426.GH3068@gmail.com> (raw)
In-Reply-To: <1405603773-32688-13-git-send-email-oded.gabbay@amd.com>
On Thu, Jul 17, 2014 at 04:29:19PM +0300, Oded Gabbay wrote:
> This patch adds the functions to bind and unbind pasid from a device through the amd_iommu driver.
>
> The unbind function is called when the mm_struct of the process is released.
>
> The bind function is not called here because it is called only in the IOCTLs which are not yet implemented at this stage of the patchset.
Commit message should follow the 80 char per line rules too IIRC
No other comment than apply the 80char for the patch too.
>
> Signed-off-by: Oded Gabbay <oded.gabbay@amd.com>
> ---
> drivers/gpu/drm/radeon/amdkfd/kfd_device.c | 80 ++++++++++++++++++++++++++++-
> drivers/gpu/drm/radeon/amdkfd/kfd_priv.h | 1 +
> drivers/gpu/drm/radeon/amdkfd/kfd_process.c | 12 +++++
> 3 files changed, 92 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/radeon/amdkfd/kfd_device.c b/drivers/gpu/drm/radeon/amdkfd/kfd_device.c
> index f6a7cf7..7c4c836 100644
> --- a/drivers/gpu/drm/radeon/amdkfd/kfd_device.c
> +++ b/drivers/gpu/drm/radeon/amdkfd/kfd_device.c
> @@ -95,6 +95,59 @@ struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev)
> return kfd;
> }
>
> +static bool device_iommu_pasid_init(struct kfd_dev *kfd)
> +{
> + const u32 required_iommu_flags = AMD_IOMMU_DEVICE_FLAG_ATS_SUP | AMD_IOMMU_DEVICE_FLAG_PRI_SUP
> + | AMD_IOMMU_DEVICE_FLAG_PASID_SUP;
> +
> + struct amd_iommu_device_info iommu_info;
> + pasid_t pasid_limit;
> + int err;
> +
> + err = amd_iommu_device_info(kfd->pdev, &iommu_info);
> + if (err < 0) {
> + dev_err(kfd_device, "error getting iommu info. is the iommu enabled?\n");
> + return false;
> + }
> +
> + if ((iommu_info.flags & required_iommu_flags) != required_iommu_flags) {
> + dev_err(kfd_device, "error required iommu flags ats(%i), pri(%i), pasid(%i)\n",
> + (iommu_info.flags & AMD_IOMMU_DEVICE_FLAG_ATS_SUP) != 0,
> + (iommu_info.flags & AMD_IOMMU_DEVICE_FLAG_PRI_SUP) != 0,
> + (iommu_info.flags & AMD_IOMMU_DEVICE_FLAG_PASID_SUP) != 0);
> + return false;
> + }
> +
> + pasid_limit = min_t(pasid_t, (pasid_t)1 << kfd->device_info->max_pasid_bits, iommu_info.max_pasids);
> + /*
> + * last pasid is used for kernel queues doorbells
> + * in the future the last pasid might be used for a kernel thread.
> + */
> + pasid_limit = min_t(pasid_t, pasid_limit, kfd->doorbell_process_limit - 1);
> +
> + err = amd_iommu_init_device(kfd->pdev, pasid_limit);
> + if (err < 0) {
> + dev_err(kfd_device, "error initializing iommu device\n");
> + return false;
> + }
> +
> + if (!kfd_set_pasid_limit(pasid_limit)) {
> + dev_err(kfd_device, "error setting pasid limit\n");
> + amd_iommu_free_device(kfd->pdev);
> + return false;
> + }
> +
> + return true;
> +}
> +
> +static void iommu_pasid_shutdown_callback(struct pci_dev *pdev, int pasid)
> +{
> + struct kfd_dev *dev = kfd_device_by_pci_dev(pdev);
> +
> + if (dev)
> + kfd_unbind_process_from_device(dev, pasid);
> +}
> +
> bool kgd2kfd_device_init(struct kfd_dev *kfd,
> const struct kgd2kfd_shared_resources *gpu_resources)
> {
> @@ -102,8 +155,15 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
>
> kfd_doorbell_init(kfd);
>
> - if (kfd_topology_add_device(kfd) != 0)
> + if (!device_iommu_pasid_init(kfd))
> + return false;
> +
> + if (kfd_topology_add_device(kfd) != 0) {
> + amd_iommu_free_device(kfd->pdev);
> return false;
> + }
> +
> + amd_iommu_set_invalidate_ctx_cb(kfd->pdev, iommu_pasid_shutdown_callback);
>
> kfd->init_complete = true;
> dev_info(kfd_device, "added device (%x:%x)\n", kfd->pdev->vendor,
> @@ -118,18 +178,36 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
>
> BUG_ON(err != 0);
>
> + if (kfd->init_complete)
> + amd_iommu_free_device(kfd->pdev);
> +
> kfree(kfd);
> }
>
> void kgd2kfd_suspend(struct kfd_dev *kfd)
> {
> BUG_ON(kfd == NULL);
> +
> + if (kfd->init_complete)
> + amd_iommu_free_device(kfd->pdev);
> }
>
> int kgd2kfd_resume(struct kfd_dev *kfd)
> {
> + pasid_t pasid_limit;
> + int err;
> +
> BUG_ON(kfd == NULL);
>
> + pasid_limit = kfd_get_pasid_limit();
> +
> + if (kfd->init_complete) {
> + err = amd_iommu_init_device(kfd->pdev, pasid_limit);
> + if (err < 0)
> + return -ENXIO;
> + amd_iommu_set_invalidate_ctx_cb(kfd->pdev, iommu_pasid_shutdown_callback);
> + }
> +
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/radeon/amdkfd/kfd_priv.h b/drivers/gpu/drm/radeon/amdkfd/kfd_priv.h
> index af5a5e4..604c317 100644
> --- a/drivers/gpu/drm/radeon/amdkfd/kfd_priv.h
> +++ b/drivers/gpu/drm/radeon/amdkfd/kfd_priv.h
> @@ -195,6 +195,7 @@ struct kfd_process {
> struct kfd_process *kfd_create_process(const struct task_struct *);
> struct kfd_process *kfd_get_process(const struct task_struct *);
>
> +void kfd_unbind_process_from_device(struct kfd_dev *dev, pasid_t pasid);
> struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev,
> struct kfd_process *p);
>
> diff --git a/drivers/gpu/drm/radeon/amdkfd/kfd_process.c b/drivers/gpu/drm/radeon/amdkfd/kfd_process.c
> index 5efbce0..908b3b7 100644
> --- a/drivers/gpu/drm/radeon/amdkfd/kfd_process.c
> +++ b/drivers/gpu/drm/radeon/amdkfd/kfd_process.c
> @@ -24,6 +24,7 @@
> #include <linux/log2.h>
> #include <linux/sched.h>
> #include <linux/slab.h>
> +#include <linux/amd-iommu.h>
> #include <linux/notifier.h>
> struct mm_struct;
>
> @@ -97,6 +98,7 @@ static void free_process(struct kfd_process *p)
> BUG_ON(p == NULL);
>
> list_for_each_entry_safe(pdd, temp, &p->per_device_data, per_device_list) {
> + amd_iommu_unbind_pasid(pdd->dev->pdev, p->pasid);
> list_del(&pdd->per_device_list);
> kfree(pdd);
> }
> @@ -199,6 +201,7 @@ struct kfd_process_device *kfd_bind_process_to_device(struct kfd_dev *dev,
> struct kfd_process *p)
> {
> struct kfd_process_device *pdd = kfd_get_process_device_data(dev, p);
> + int err;
>
> if (pdd == NULL)
> return ERR_PTR(-ENOMEM);
> @@ -206,6 +209,15 @@ struct kfd_process_device *kfd_bind_process_to_device(struct kfd_dev *dev,
> if (pdd->bound)
> return pdd;
>
> + err = amd_iommu_bind_pasid(dev->pdev, p->pasid, p->lead_thread);
> + if (err < 0)
> + return ERR_PTR(err);
> +
> + if (err < 0) {
> + amd_iommu_unbind_pasid(dev->pdev, p->pasid);
> + return ERR_PTR(err);
> + }
> +
> pdd->bound = true;
>
> return pdd;
> --
> 1.9.1
>
next prev parent reply other threads:[~2014-07-20 23:04 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1405603773-32688-1-git-send-email-oded.gabbay@amd.com>
2014-07-17 13:29 ` [PATCH v2 01/25] mm: Add kfd_process pointer to mm_struct Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 02/25] drm/radeon: reduce number of free VMIDs and pipes in KV Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 03/25] drm/radeon/cik: Don't touch int of pipes 1-7 Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 04/25] drm/radeon: Report doorbell configuration to amdkfd Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 05/25] drm/radeon: adding synchronization for GRBM GFX Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 06/25] drm/radeon: Add radeon <--> amdkfd interface Oded Gabbay
2014-07-20 17:35 ` Jerome Glisse
2014-08-02 20:07 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 07/25] Update MAINTAINERS and CREDITS files with amdkfd info Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 08/25] amdkfd: Add IOCTL set definitions of amdkfd Oded Gabbay
2014-07-20 16:54 ` Jerome Glisse
2014-08-02 20:00 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 09/25] amdkfd: Add amdkfd skeleton driver Oded Gabbay
2014-07-20 17:09 ` Jerome Glisse
2014-08-02 19:55 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 10/25] amdkfd: Add topology module to amdkfd Oded Gabbay
2014-07-20 22:37 ` Jerome Glisse
2014-07-27 11:15 ` Oded Gabbay
2014-07-30 12:10 ` Oded Gabbay
2014-07-27 11:26 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 11/25] amdkfd: Add basic modules " Oded Gabbay
2014-07-20 23:02 ` Jerome Glisse
2014-08-02 19:25 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 12/25] amdkfd: Add binding/unbinding calls to amd_iommu driver Oded Gabbay
2014-07-20 23:04 ` Jerome Glisse [this message]
2014-07-27 11:11 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 13/25] amdkfd: Add queue module Oded Gabbay
2014-07-20 23:06 ` Jerome Glisse
2014-07-27 11:09 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 14/25] amdkfd: Add mqd_manager module Oded Gabbay
2014-07-21 2:33 ` Jerome Glisse
2014-08-02 19:18 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 15/25] amdkfd: Add kernel queue module Oded Gabbay
2014-07-21 2:42 ` Jerome Glisse
2014-07-27 11:05 ` Oded Gabbay
2014-07-27 12:40 ` Christian König
2014-07-17 13:29 ` [PATCH v2 16/25] amdkfd: Add module parameter of scheduling policy Oded Gabbay
2014-07-21 2:45 ` Jerome Glisse
2014-07-27 10:21 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 17/25] amdkfd: Add packet manager module Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 18/25] amdkfd: Add process queue " Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 19/25] amdkfd: Add device " Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 20/25] amdkfd: Add interrupt handling module Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 21/25] amdkfd: Implement the create/destroy/update queue IOCTLs Oded Gabbay
2014-07-20 23:09 ` Jerome Glisse
2014-07-27 10:15 ` Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 22/25] amdkfd: Implement the Set Memory Policy IOCTL Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 23/25] amdkfd: Implement the Get Clock Counters IOCTL Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 24/25] amdkfd: Implement the Get Process Aperture IOCTL Oded Gabbay
2014-07-17 13:29 ` [PATCH v2 25/25] amdkfd: Implement the PMC Acquire/Release IOCTLs Oded Gabbay
2014-07-17 13:57 ` [PATCH v2 01/25] mm: Add kfd_process pointer to mm_struct Oded Gabbay
2014-07-17 14:12 ` Jerome Glisse
2014-07-17 14:15 ` Oded Gabbay
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=20140720230426.GH3068@gmail.com \
--to=j.glisse@gmail.com \
--cc=Alexey.Skidanov@amd.com \
--cc=Andrew.Lewycky@amd.com \
--cc=Ben.Goz@amd.com \
--cc=Evgeny.Pinchuk@amd.com \
--cc=John.Bridgman@amd.com \
--cc=airlied@linux.ie \
--cc=akpm@linux-foundation.org \
--cc=alexander.deucher@amd.com \
--cc=alexdeucher@gmail.com \
--cc=christian.koenig@amd.com \
--cc=deathsimple@vodafone.de \
--cc=dri-devel@lists.freedesktop.org \
--cc=joro@8bytes.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michel.daenzer@amd.com \
--cc=oded.gabbay@amd.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: 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).