x86/amd-iommu: Add an index field to struct amd_iommu
This patch adds an index field to struct amd_iommu which can be used to lookup it up in an array. This index will be used in struct protection_domain to keep track which protection domain has devices behind which IOMMU. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
This commit is contained in:
parent
bf3118c127
commit
bb52777ec4
|
@ -24,6 +24,11 @@
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum number of IOMMUs supported
|
||||||
|
*/
|
||||||
|
#define MAX_IOMMUS 32
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* some size calculation constants
|
* some size calculation constants
|
||||||
*/
|
*/
|
||||||
|
@ -291,6 +296,9 @@ struct dma_ops_domain {
|
||||||
struct amd_iommu {
|
struct amd_iommu {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
|
||||||
|
/* Index within the IOMMU array */
|
||||||
|
int index;
|
||||||
|
|
||||||
/* locks the accesses to the hardware */
|
/* locks the accesses to the hardware */
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
|
|
||||||
|
@ -356,6 +364,15 @@ struct amd_iommu {
|
||||||
*/
|
*/
|
||||||
extern struct list_head amd_iommu_list;
|
extern struct list_head amd_iommu_list;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Array with pointers to each IOMMU struct
|
||||||
|
* The indices are referenced in the protection domains
|
||||||
|
*/
|
||||||
|
extern struct amd_iommu *amd_iommus[MAX_IOMMUS];
|
||||||
|
|
||||||
|
/* Number of IOMMUs present in the system */
|
||||||
|
extern int amd_iommus_present;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Structure defining one entry in the device table
|
* Structure defining one entry in the device table
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -137,6 +137,10 @@ bool amd_iommu_unmap_flush; /* if true, flush on every unmap */
|
||||||
LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the
|
LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the
|
||||||
system */
|
system */
|
||||||
|
|
||||||
|
/* Array to assign indices to IOMMUs*/
|
||||||
|
struct amd_iommu *amd_iommus[MAX_IOMMUS];
|
||||||
|
int amd_iommus_present;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pointer to the device table which is shared by all AMD IOMMUs
|
* Pointer to the device table which is shared by all AMD IOMMUs
|
||||||
* it is indexed by the PCI device id or the HT unit id and contains
|
* it is indexed by the PCI device id or the HT unit id and contains
|
||||||
|
@ -840,7 +844,18 @@ static void __init free_iommu_all(void)
|
||||||
static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h)
|
static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h)
|
||||||
{
|
{
|
||||||
spin_lock_init(&iommu->lock);
|
spin_lock_init(&iommu->lock);
|
||||||
|
|
||||||
|
/* Add IOMMU to internal data structures */
|
||||||
list_add_tail(&iommu->list, &amd_iommu_list);
|
list_add_tail(&iommu->list, &amd_iommu_list);
|
||||||
|
iommu->index = amd_iommus_present++;
|
||||||
|
|
||||||
|
if (unlikely(iommu->index >= MAX_IOMMUS)) {
|
||||||
|
WARN(1, "AMD-Vi: System has more IOMMUs than supported by this driver\n");
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Index is fine - add IOMMU to the array */
|
||||||
|
amd_iommus[iommu->index] = iommu;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy data from ACPI table entry to the iommu struct
|
* Copy data from ACPI table entry to the iommu struct
|
||||||
|
|
Loading…
Reference in a new issue