From: Oded Gabbay <oded.gabbay@amd.com>
To: Jerome Glisse <j.glisse@gmail.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>,
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, 27 Jul 2014 14:11:12 +0300 [thread overview]
Message-ID: <53D4DE50.9030707@amd.com> (raw)
In-Reply-To: <20140720230426.GH3068@gmail.com>
On 21/07/14 02:04, Jerome Glisse wrote:
> 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.
Done in v3 for commit msg.
For the patch, I tried to minimize the lines above 80 char as much as I could
without harming readability of the code.
Oded
>
>>
>> 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-27 11:11 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
2014-07-27 11:11 ` Oded Gabbay [this message]
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=53D4DE50.9030707@amd.com \
--to=oded.gabbay@amd.com \
--cc=Alexey.Skidanov@amd.com \
--cc=Andrew.Lewycky@amd.com \
--cc=Ben.Goz@amd.com \
--cc=John.Bridgman@amd.com \
--cc=airlied@linux.ie \
--cc=akpm@linux-foundation.org \
--cc=alexdeucher@gmail.com \
--cc=deathsimple@vodafone.de \
--cc=dri-devel@lists.freedesktop.org \
--cc=j.glisse@gmail.com \
--cc=joro@8bytes.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michel.daenzer@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).