Add the ability to inject IOMMU faults. We enable this per device via a fail_iommu sysfs property, similar to fault injection on other subsystems. An example: ... 0003:01:00.1 Ethernet controller: Emulex Corporation OneConnect 10Gb NIC (be3) (rev 02) To inject one error to this device: echo 1 > /sys/bus/pci/devices/0003:01:00.1/fail_iommu echo 1 > /sys/kernel/debug/fail_iommu/probability echo 1 > /sys/kernel/debug/fail_iommu/times As feared, the first failure injected on the be3 results in an unrecoverable error, taking down both functions of the card permanently: be2net 0003:01:00.1: Unrecoverable error in the card Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
		
			
				
	
	
		
			48 lines
		
	
	
	
		
			927 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
	
		
			927 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Arch specific extensions to struct device
 | 
						|
 *
 | 
						|
 * This file is released under the GPLv2
 | 
						|
 */
 | 
						|
#ifndef _ASM_POWERPC_DEVICE_H
 | 
						|
#define _ASM_POWERPC_DEVICE_H
 | 
						|
 | 
						|
struct dma_map_ops;
 | 
						|
struct device_node;
 | 
						|
 | 
						|
/*
 | 
						|
 * Arch extensions to struct device.
 | 
						|
 *
 | 
						|
 * When adding fields, consider macio_add_one_device in
 | 
						|
 * drivers/macintosh/macio_asic.c
 | 
						|
 */
 | 
						|
struct dev_archdata {
 | 
						|
	/* DMA operations on that device */
 | 
						|
	struct dma_map_ops	*dma_ops;
 | 
						|
 | 
						|
	/*
 | 
						|
	 * When an iommu is in use, dma_data is used as a ptr to the base of the
 | 
						|
	 * iommu_table.  Otherwise, it is a simple numerical offset.
 | 
						|
	 */
 | 
						|
	union {
 | 
						|
		dma_addr_t	dma_offset;
 | 
						|
		void		*iommu_table_base;
 | 
						|
	} dma_data;
 | 
						|
 | 
						|
#ifdef CONFIG_SWIOTLB
 | 
						|
	dma_addr_t		max_direct_dma_addr;
 | 
						|
#endif
 | 
						|
#ifdef CONFIG_EEH
 | 
						|
	struct eeh_dev		*edev;
 | 
						|
#endif
 | 
						|
#ifdef CONFIG_FAIL_IOMMU
 | 
						|
	int fail_iommu;
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
struct pdev_archdata {
 | 
						|
	u64 dma_mask;
 | 
						|
};
 | 
						|
 | 
						|
#define ARCH_HAS_DMA_GET_REQUIRED_MASK
 | 
						|
 | 
						|
#endif /* _ASM_POWERPC_DEVICE_H */
 |