mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	iommu: Enable debugfs exposure of IOMMU driver internals
Provide base enablement for using debugfs to expose internal data of an IOMMU driver. When called, create the /sys/kernel/debug/iommu directory. Emit a strong warning at boot time to indicate that this feature is enabled. This function is called from iommu_init, and creates the initial DebugFS directory. Drivers may then call iommu_debugfs_new_driver_dir() to instantiate a device-specific directory to expose internal data. It will return a pointer to the new dentry structure created in /sys/kernel/debug/iommu, or NULL in the event of a failure. Since the IOMMU driver can not be removed from the running system, there is no need for an "off" function. Signed-off-by: Gary R Hook <gary.hook@amd.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
		
							parent
							
								
									021c91791a
								
							
						
					
					
						commit
						bad614b242
					
				
					 5 changed files with 86 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -60,6 +60,16 @@ config IOMMU_IO_PGTABLE_ARMV7S_SELFTEST
 | 
			
		|||
 | 
			
		||||
endmenu
 | 
			
		||||
 | 
			
		||||
config IOMMU_DEBUGFS
 | 
			
		||||
	bool "Export IOMMU internals in DebugFS"
 | 
			
		||||
	depends on DEBUG_FS
 | 
			
		||||
	help
 | 
			
		||||
	  Allows exposure of IOMMU device internals. This option enables
 | 
			
		||||
	  the use of debugfs by IOMMU drivers as required. Devices can,
 | 
			
		||||
	  at initialization time, cause the IOMMU code to create a top-level
 | 
			
		||||
	  debug/iommu directory, and then populate a subdirectory with
 | 
			
		||||
	  entries as required.
 | 
			
		||||
 | 
			
		||||
config IOMMU_IOVA
 | 
			
		||||
	tristate
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
obj-$(CONFIG_IOMMU_API) += iommu.o
 | 
			
		||||
obj-$(CONFIG_IOMMU_API) += iommu-traces.o
 | 
			
		||||
obj-$(CONFIG_IOMMU_API) += iommu-sysfs.o
 | 
			
		||||
obj-$(CONFIG_IOMMU_DEBUGFS) += iommu-debugfs.o
 | 
			
		||||
obj-$(CONFIG_IOMMU_DMA) += dma-iommu.o
 | 
			
		||||
obj-$(CONFIG_IOMMU_IO_PGTABLE) += io-pgtable.o
 | 
			
		||||
obj-$(CONFIG_IOMMU_IO_PGTABLE_ARMV7S) += io-pgtable-arm-v7s.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										66
									
								
								drivers/iommu/iommu-debugfs.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								drivers/iommu/iommu-debugfs.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,66 @@
 | 
			
		|||
// SPDX-License-Identifier: GPL-2.0
 | 
			
		||||
/*
 | 
			
		||||
 * IOMMU debugfs core infrastructure
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2018 Advanced Micro Devices, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Gary R Hook <gary.hook@amd.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/iommu.h>
 | 
			
		||||
#include <linux/debugfs.h>
 | 
			
		||||
 | 
			
		||||
struct dentry *iommu_debugfs_dir;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * iommu_debugfs_setup - create the top-level iommu directory in debugfs
 | 
			
		||||
 *
 | 
			
		||||
 * Provide base enablement for using debugfs to expose internal data of an
 | 
			
		||||
 * IOMMU driver. When called, this function creates the
 | 
			
		||||
 * /sys/kernel/debug/iommu directory.
 | 
			
		||||
 *
 | 
			
		||||
 * Emit a strong warning at boot time to indicate that this feature is
 | 
			
		||||
 * enabled.
 | 
			
		||||
 *
 | 
			
		||||
 * This function is called from iommu_init; drivers may then call
 | 
			
		||||
 * iommu_debugfs_new_driver_dir() to instantiate a vendor-specific
 | 
			
		||||
 * directory to be used to expose internal data.
 | 
			
		||||
 */
 | 
			
		||||
void iommu_debugfs_setup(void)
 | 
			
		||||
{
 | 
			
		||||
	if (!iommu_debugfs_dir) {
 | 
			
		||||
		iommu_debugfs_dir = debugfs_create_dir("iommu", NULL);
 | 
			
		||||
		pr_warn("\n");
 | 
			
		||||
		pr_warn("*************************************************************\n");
 | 
			
		||||
		pr_warn("**     NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE    **\n");
 | 
			
		||||
		pr_warn("**                                                         **\n");
 | 
			
		||||
		pr_warn("**  IOMMU DebugFS SUPPORT HAS BEEN ENABLED IN THIS KERNEL  **\n");
 | 
			
		||||
		pr_warn("**                                                         **\n");
 | 
			
		||||
		pr_warn("** This means that this kernel is built to expose internal **\n");
 | 
			
		||||
		pr_warn("** IOMMU data structures, which may compromise security on **\n");
 | 
			
		||||
		pr_warn("** your system.                                            **\n");
 | 
			
		||||
		pr_warn("**                                                         **\n");
 | 
			
		||||
		pr_warn("** If you see this message and you are not debugging the   **\n");
 | 
			
		||||
		pr_warn("** kernel, report this immediately to your vendor!         **\n");
 | 
			
		||||
		pr_warn("**                                                         **\n");
 | 
			
		||||
		pr_warn("**     NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE    **\n");
 | 
			
		||||
		pr_warn("*************************************************************\n");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * iommu_debugfs_new_driver_dir - create a vendor directory under debugfs/iommu
 | 
			
		||||
 * @vendor: name of the vendor-specific subdirectory to create
 | 
			
		||||
 *
 | 
			
		||||
 * This function is called by an IOMMU driver to create the top-level debugfs
 | 
			
		||||
 * directory for that driver.
 | 
			
		||||
 *
 | 
			
		||||
 * Return: upon success, a pointer to the dentry for the new directory.
 | 
			
		||||
 *         NULL in case of failure.
 | 
			
		||||
 */
 | 
			
		||||
struct dentry *iommu_debugfs_new_driver_dir(const char *vendor)
 | 
			
		||||
{
 | 
			
		||||
	return debugfs_create_dir(vendor, iommu_debugfs_dir);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(iommu_debugfs_new_driver_dir);
 | 
			
		||||
| 
						 | 
				
			
			@ -1748,6 +1748,8 @@ static int __init iommu_init(void)
 | 
			
		|||
					       NULL, kernel_kobj);
 | 
			
		||||
	BUG_ON(!iommu_group_kset);
 | 
			
		||||
 | 
			
		||||
	iommu_debugfs_setup();
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
core_initcall(iommu_init);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -698,4 +698,11 @@ const struct iommu_ops *iommu_ops_from_fwnode(struct fwnode_handle *fwnode)
 | 
			
		|||
 | 
			
		||||
#endif /* CONFIG_IOMMU_API */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_IOMMU_DEBUGFS
 | 
			
		||||
extern	struct dentry *iommu_debugfs_dir;
 | 
			
		||||
void iommu_debugfs_setup(void);
 | 
			
		||||
#else
 | 
			
		||||
static inline void iommu_debugfs_setup(void) {}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __LINUX_IOMMU_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue