-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This adds the system wide PASID name space for the PASID allocation. Currently we are using per IOMMU PASID name spaces which are not suitable for some use cases. For an example, one application (associated with a PASID) might talk to two physical devices simultaneously while the two devices could reside behind two different IOMMU units. Cc: Ashok Raj <ashok.raj@intel.com> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> Cc: Kevin Tian <kevin.tian@intel.com> Cc: Liu Yi L <yi.l.liu@intel.com> Suggested-by: Ashok Raj <ashok.raj@intel.com> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Liu Yi L <yi.l.liu@intel.com> Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
- Loading branch information
Lu Baolu
authored and
Joerg Roedel
committed
Jul 20, 2018
1 parent
3e781fc
commit 5628317
Showing
4 changed files
with
95 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/** | ||
* intel-pasid.c - PASID idr, table and entry manipulation | ||
* | ||
* Copyright (C) 2018 Intel Corporation | ||
* | ||
* Author: Lu Baolu <baolu.lu@linux.intel.com> | ||
*/ | ||
|
||
#define pr_fmt(fmt) "DMAR: " fmt | ||
|
||
#include <linux/dmar.h> | ||
#include <linux/intel-iommu.h> | ||
#include <linux/iommu.h> | ||
#include <linux/memory.h> | ||
#include <linux/spinlock.h> | ||
|
||
#include "intel-pasid.h" | ||
|
||
/* | ||
* Intel IOMMU system wide PASID name space: | ||
*/ | ||
static DEFINE_SPINLOCK(pasid_lock); | ||
u32 intel_pasid_max_id = PASID_MAX; | ||
static DEFINE_IDR(pasid_idr); | ||
|
||
int intel_pasid_alloc_id(void *ptr, int start, int end, gfp_t gfp) | ||
{ | ||
int ret, min, max; | ||
|
||
min = max_t(int, start, PASID_MIN); | ||
max = min_t(int, end, intel_pasid_max_id); | ||
|
||
WARN_ON(in_interrupt()); | ||
idr_preload(gfp); | ||
spin_lock(&pasid_lock); | ||
ret = idr_alloc(&pasid_idr, ptr, min, max, GFP_ATOMIC); | ||
spin_unlock(&pasid_lock); | ||
idr_preload_end(); | ||
|
||
return ret; | ||
} | ||
|
||
void intel_pasid_free_id(int pasid) | ||
{ | ||
spin_lock(&pasid_lock); | ||
idr_remove(&pasid_idr, pasid); | ||
spin_unlock(&pasid_lock); | ||
} | ||
|
||
void *intel_pasid_lookup_id(int pasid) | ||
{ | ||
void *p; | ||
|
||
spin_lock(&pasid_lock); | ||
p = idr_find(&pasid_idr, pasid); | ||
spin_unlock(&pasid_lock); | ||
|
||
return p; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* intel-pasid.h - PASID idr, table and entry header | ||
* | ||
* Copyright (C) 2018 Intel Corporation | ||
* | ||
* Author: Lu Baolu <baolu.lu@linux.intel.com> | ||
*/ | ||
|
||
#ifndef __INTEL_PASID_H | ||
#define __INTEL_PASID_H | ||
|
||
#define PASID_MIN 0x1 | ||
#define PASID_MAX 0x100000 | ||
|
||
extern u32 intel_pasid_max_id; | ||
int intel_pasid_alloc_id(void *ptr, int start, int end, gfp_t gfp); | ||
void intel_pasid_free_id(int pasid); | ||
void *intel_pasid_lookup_id(int pasid); | ||
|
||
#endif /* __INTEL_PASID_H */ |