Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -145,6 +145,18 @@ config AMD_IOMMU_V2
	  hardware. Select this option if you want to use devices that support
	  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
config DMAR_TABLE
	bool
+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ obj-$(CONFIG_IOMMU_IOVA) += iova.o
obj-$(CONFIG_OF_IOMMU)	+= of_iommu.o
obj-$(CONFIG_MSM_IOMMU) += msm_iommu.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_ARM_SMMU) += arm-smmu.o
obj-$(CONFIG_ARM_SMMU_V3) += arm-smmu-v3.o
+33 −0
Original line number Diff line number Diff line
// 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
Original line number Diff line number Diff line
@@ -2721,6 +2721,7 @@ int __init amd_iommu_enable_faulting(void)
 */
static int __init amd_iommu_init(void)
{
	struct amd_iommu *iommu;
	int ret;

	ret = iommu_go_to_state(IOMMU_INITIALIZED);
@@ -2730,14 +2731,15 @@ static int __init amd_iommu_init(void)
			disable_iommus();
			free_iommu_resources();
		} else {
			struct amd_iommu *iommu;

			uninit_device_table_dma();
			for_each_iommu(iommu)
				iommu_flush_all_caches(iommu);
		}
	}

	for_each_iommu(iommu)
		amd_iommu_debugfs_setup(iommu);

	return ret;
}

+6 −0
Original line number Diff line number Diff line
@@ -33,6 +33,12 @@ extern void amd_iommu_uninit_devices(void);
extern void amd_iommu_init_notifier(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 */
extern int amd_iommu_prepare(void);
extern int amd_iommu_enable(void);
Loading