Commit 7d0f5fd3 authored by Gary R Hook's avatar Gary R Hook Committed by Joerg Roedel

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: default avatarGary R Hook <gary.hook@amd.com>
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent bad614b2
...@@ -145,6 +145,18 @@ config AMD_IOMMU_V2 ...@@ -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
......
...@@ -11,6 +11,7 @@ obj-$(CONFIG_IOMMU_IOVA) += iova.o ...@@ -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
......
// 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);
}
...@@ -2721,6 +2721,7 @@ int __init amd_iommu_enable_faulting(void) ...@@ -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) ...@@ -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;
} }
......
...@@ -33,6 +33,12 @@ extern void amd_iommu_uninit_devices(void); ...@@ -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);
......
...@@ -594,6 +594,11 @@ struct amd_iommu { ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment