1
0
Fork 0

iommu/amd: Add basic debugfs infrastructure for AMD IOMMU

Implement a skeleton framework for debugfs support in the AMD
IOMMU.  Add an AMD-specific Kconfig boolean that depends upon
general enablement of DebugFS in the IOMMU.

Signed-off-by: Gary R Hook <gary.hook@amd.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
hifive-unleashed-5.1
Gary R Hook 2018-06-12 16:41:30 -05:00 committed by Joerg Roedel
parent bad614b242
commit 7d0f5fd3e4
6 changed files with 61 additions and 2 deletions

View File

@ -145,6 +145,18 @@ config AMD_IOMMU_V2
hardware. Select this option if you want to use devices that support hardware. Select this option if you want to use devices that support
the PCI PRI and PASID interface. the PCI PRI and PASID interface.
config AMD_IOMMU_DEBUGFS
bool "Enable AMD IOMMU internals in DebugFS"
depends on AMD_IOMMU && IOMMU_DEBUGFS
---help---
!!!WARNING!!! !!!WARNING!!! !!!WARNING!!! !!!WARNING!!!
DO NOT ENABLE THIS OPTION UNLESS YOU REALLY, -REALLY- KNOW WHAT YOU ARE DOING!!!
Exposes AMD IOMMU device internals in DebugFS.
This option is -NOT- intended for production environments, and should
not generally be enabled.
# Intel IOMMU support # Intel IOMMU support
config DMAR_TABLE config DMAR_TABLE
bool bool

View File

@ -11,6 +11,7 @@ obj-$(CONFIG_IOMMU_IOVA) += iova.o
obj-$(CONFIG_OF_IOMMU) += of_iommu.o obj-$(CONFIG_OF_IOMMU) += of_iommu.o
obj-$(CONFIG_MSM_IOMMU) += msm_iommu.o obj-$(CONFIG_MSM_IOMMU) += msm_iommu.o
obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o
obj-$(CONFIG_AMD_IOMMU_DEBUGFS) += amd_iommu_debugfs.o
obj-$(CONFIG_AMD_IOMMU_V2) += amd_iommu_v2.o obj-$(CONFIG_AMD_IOMMU_V2) += amd_iommu_v2.o
obj-$(CONFIG_ARM_SMMU) += arm-smmu.o obj-$(CONFIG_ARM_SMMU) += arm-smmu.o
obj-$(CONFIG_ARM_SMMU_V3) += arm-smmu-v3.o obj-$(CONFIG_ARM_SMMU_V3) += arm-smmu-v3.o

View File

@ -0,0 +1,33 @@
// SPDX-License-Identifier: GPL-2.0
/*
* AMD IOMMU driver
*
* Copyright (C) 2018 Advanced Micro Devices, Inc.
*
* Author: Gary R Hook <gary.hook@amd.com>
*/
#include <linux/debugfs.h>
#include <linux/iommu.h>
#include <linux/pci.h>
#include "amd_iommu_proto.h"
#include "amd_iommu_types.h"
static struct dentry *amd_iommu_debugfs;
static DEFINE_MUTEX(amd_iommu_debugfs_lock);
#define MAX_NAME_LEN 20
void amd_iommu_debugfs_setup(struct amd_iommu *iommu)
{
char name[MAX_NAME_LEN + 1];
mutex_lock(&amd_iommu_debugfs_lock);
if (!amd_iommu_debugfs)
amd_iommu_debugfs = debugfs_create_dir("amd",
iommu_debugfs_dir);
mutex_unlock(&amd_iommu_debugfs_lock);
snprintf(name, MAX_NAME_LEN, "iommu%02d", iommu->index);
iommu->debugfs = debugfs_create_dir(name, amd_iommu_debugfs);
}

View File

@ -2721,6 +2721,7 @@ int __init amd_iommu_enable_faulting(void)
*/ */
static int __init amd_iommu_init(void) static int __init amd_iommu_init(void)
{ {
struct amd_iommu *iommu;
int ret; int ret;
ret = iommu_go_to_state(IOMMU_INITIALIZED); ret = iommu_go_to_state(IOMMU_INITIALIZED);
@ -2730,14 +2731,15 @@ static int __init amd_iommu_init(void)
disable_iommus(); disable_iommus();
free_iommu_resources(); free_iommu_resources();
} else { } else {
struct amd_iommu *iommu;
uninit_device_table_dma(); uninit_device_table_dma();
for_each_iommu(iommu) for_each_iommu(iommu)
iommu_flush_all_caches(iommu); iommu_flush_all_caches(iommu);
} }
} }
for_each_iommu(iommu)
amd_iommu_debugfs_setup(iommu);
return ret; return ret;
} }

View File

@ -33,6 +33,12 @@ extern void amd_iommu_uninit_devices(void);
extern void amd_iommu_init_notifier(void); extern void amd_iommu_init_notifier(void);
extern int amd_iommu_init_api(void); extern int amd_iommu_init_api(void);
#ifdef CONFIG_AMD_IOMMU_DEBUGFS
void amd_iommu_debugfs_setup(struct amd_iommu *iommu);
#else
static inline void amd_iommu_debugfs_setup(struct amd_iommu *iommu) {}
#endif
/* Needed for interrupt remapping */ /* Needed for interrupt remapping */
extern int amd_iommu_prepare(void); extern int amd_iommu_prepare(void);
extern int amd_iommu_enable(void); extern int amd_iommu_enable(void);

View File

@ -594,6 +594,11 @@ struct amd_iommu {
u32 flags; u32 flags;
volatile u64 __aligned(8) cmd_sem; volatile u64 __aligned(8) cmd_sem;
#ifdef CONFIG_AMD_IOMMU_DEBUGFS
/* DebugFS Info */
struct dentry *debugfs;
#endif
}; };
static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev) static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev)