Эх сурвалжийг харах

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>
Gary R Hook 7 жил өмнө
parent
commit
7d0f5fd3e4

+ 12 - 0
drivers/iommu/Kconfig

@@ -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

+ 1 - 0
drivers/iommu/Makefile

@@ -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

+ 33 - 0
drivers/iommu/amd_iommu_debugfs.c

@@ -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);
+}

+ 4 - 2
drivers/iommu/amd_iommu_init.c

@@ -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;
 }
 }
 
 

+ 6 - 0
drivers/iommu/amd_iommu_proto.h

@@ -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);

+ 5 - 0
drivers/iommu/amd_iommu_types.h

@@ -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)