forked from Minki/linux
x86: Remove the calgary IOMMU driver
The calgary IOMMU was only used on high-end IBM systems in the early x86_64 age and has no known users left. Remove it to avoid having to touch it for pending changes to the DMA API. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lkml.kernel.org/r/20191113071836.21041-2-hch@lst.de
This commit is contained in:
parent
44eb5a7e5d
commit
90dc392fc4
10
MAINTAINERS
10
MAINTAINERS
@ -3629,16 +3629,6 @@ L: cake@lists.bufferbloat.net (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: net/sched/sch_cake.c
|
||||
|
||||
CALGARY x86-64 IOMMU
|
||||
M: Muli Ben-Yehuda <mulix@mulix.org>
|
||||
M: Jon Mason <jdmason@kudzu.us>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
F: arch/x86/kernel/pci-calgary_64.c
|
||||
F: arch/x86/kernel/tce_64.c
|
||||
F: arch/x86/include/asm/calgary.h
|
||||
F: arch/x86/include/asm/tce.h
|
||||
|
||||
CAN NETWORK DRIVERS
|
||||
M: Wolfgang Grandegger <wg@grandegger.com>
|
||||
M: Marc Kleine-Budde <mkl@pengutronix.de>
|
||||
|
@ -932,36 +932,6 @@ config GART_IOMMU
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config CALGARY_IOMMU
|
||||
bool "IBM Calgary IOMMU support"
|
||||
select IOMMU_HELPER
|
||||
select SWIOTLB
|
||||
depends on X86_64 && PCI
|
||||
---help---
|
||||
Support for hardware IOMMUs in IBM's xSeries x366 and x460
|
||||
systems. Needed to run systems with more than 3GB of memory
|
||||
properly with 32-bit PCI devices that do not support DAC
|
||||
(Double Address Cycle). Calgary also supports bus level
|
||||
isolation, where all DMAs pass through the IOMMU. This
|
||||
prevents them from going anywhere except their intended
|
||||
destination. This catches hard-to-find kernel bugs and
|
||||
mis-behaving drivers and devices that do not use the DMA-API
|
||||
properly to set up their DMA buffers. The IOMMU can be
|
||||
turned off at boot time with the iommu=off parameter.
|
||||
Normally the kernel will make the right choice by itself.
|
||||
If unsure, say Y.
|
||||
|
||||
config CALGARY_IOMMU_ENABLED_BY_DEFAULT
|
||||
def_bool y
|
||||
prompt "Should Calgary be enabled by default?"
|
||||
depends on CALGARY_IOMMU
|
||||
---help---
|
||||
Should Calgary be enabled by default? if you choose 'y', Calgary
|
||||
will be used (if it exists). If you choose 'n', Calgary will not be
|
||||
used even if it exists. If you choose 'n' and would like to use
|
||||
Calgary anyway, pass 'iommu=calgary' on the kernel command line.
|
||||
If unsure, say Y.
|
||||
|
||||
config MAXSMP
|
||||
bool "Enable Maximum number of SMP Processors and NUMA Nodes"
|
||||
depends on X86_64 && SMP && DEBUG_KERNEL
|
||||
|
@ -25,7 +25,6 @@ CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_CALGARY_IOMMU=y
|
||||
CONFIG_NR_CPUS=64
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_PREEMPT_VOLUNTARY=y
|
||||
|
@ -1,57 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Derived from include/asm-powerpc/iommu.h
|
||||
*
|
||||
* Copyright IBM Corporation, 2006-2007
|
||||
*
|
||||
* Author: Jon Mason <jdmason@us.ibm.com>
|
||||
* Author: Muli Ben-Yehuda <muli@il.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_X86_CALGARY_H
|
||||
#define _ASM_X86_CALGARY_H
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/timer.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
struct iommu_table {
|
||||
const struct cal_chipset_ops *chip_ops; /* chipset specific funcs */
|
||||
unsigned long it_base; /* mapped address of tce table */
|
||||
unsigned long it_hint; /* Hint for next alloc */
|
||||
unsigned long *it_map; /* A simple allocation bitmap for now */
|
||||
void __iomem *bbar; /* Bridge BAR */
|
||||
u64 tar_val; /* Table Address Register */
|
||||
struct timer_list watchdog_timer;
|
||||
spinlock_t it_lock; /* Protects it_map */
|
||||
unsigned int it_size; /* Size of iommu table in entries */
|
||||
unsigned char it_busno; /* Bus number this table belongs to */
|
||||
};
|
||||
|
||||
struct cal_chipset_ops {
|
||||
void (*handle_quirks)(struct iommu_table *tbl, struct pci_dev *dev);
|
||||
void (*tce_cache_blast)(struct iommu_table *tbl);
|
||||
void (*dump_error_regs)(struct iommu_table *tbl);
|
||||
};
|
||||
|
||||
#define TCE_TABLE_SIZE_UNSPECIFIED ~0
|
||||
#define TCE_TABLE_SIZE_64K 0
|
||||
#define TCE_TABLE_SIZE_128K 1
|
||||
#define TCE_TABLE_SIZE_256K 2
|
||||
#define TCE_TABLE_SIZE_512K 3
|
||||
#define TCE_TABLE_SIZE_1M 4
|
||||
#define TCE_TABLE_SIZE_2M 5
|
||||
#define TCE_TABLE_SIZE_4M 6
|
||||
#define TCE_TABLE_SIZE_8M 7
|
||||
|
||||
extern int use_calgary;
|
||||
|
||||
#ifdef CONFIG_CALGARY_IOMMU
|
||||
extern int detect_calgary(void);
|
||||
#else
|
||||
static inline int detect_calgary(void) { return -ENODEV; }
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_CALGARY_H */
|
@ -4,20 +4,6 @@
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifdef CONFIG_CALGARY_IOMMU
|
||||
static inline void *pci_iommu(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_sysdata *sd = bus->sysdata;
|
||||
return sd->iommu;
|
||||
}
|
||||
|
||||
static inline void set_pci_iommu(struct pci_bus *bus, void *val)
|
||||
{
|
||||
struct pci_sysdata *sd = bus->sysdata;
|
||||
sd->iommu = val;
|
||||
}
|
||||
#endif /* CONFIG_CALGARY_IOMMU */
|
||||
|
||||
extern int (*pci_config_read)(int seg, int bus, int dev, int fn,
|
||||
int reg, int len, u32 *value);
|
||||
extern int (*pci_config_write)(int seg, int bus, int dev, int fn,
|
||||
|
@ -1,35 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* This file is derived from asm-powerpc/tce.h.
|
||||
*
|
||||
* Copyright (C) IBM Corporation, 2006
|
||||
*
|
||||
* Author: Muli Ben-Yehuda <muli@il.ibm.com>
|
||||
* Author: Jon Mason <jdmason@us.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_X86_TCE_H
|
||||
#define _ASM_X86_TCE_H
|
||||
|
||||
extern unsigned int specified_table_size;
|
||||
struct iommu_table;
|
||||
|
||||
#define TCE_ENTRY_SIZE 8 /* in bytes */
|
||||
|
||||
#define TCE_READ_SHIFT 0
|
||||
#define TCE_WRITE_SHIFT 1
|
||||
#define TCE_HUBID_SHIFT 2 /* unused */
|
||||
#define TCE_RSVD_SHIFT 8 /* unused */
|
||||
#define TCE_RPN_SHIFT 12
|
||||
#define TCE_UNUSED_SHIFT 48 /* unused */
|
||||
|
||||
#define TCE_RPN_MASK 0x0000fffffffff000ULL
|
||||
|
||||
extern void tce_build(struct iommu_table *tbl, unsigned long index,
|
||||
unsigned int npages, unsigned long uaddr, int direction);
|
||||
extern void tce_free(struct iommu_table *tbl, long index, unsigned int npages);
|
||||
extern void * __init alloc_tce_table(void);
|
||||
extern void __init free_tce_table(void *tbl);
|
||||
extern int __init build_tce_table(struct pci_dev *dev, void __iomem *bbar);
|
||||
|
||||
#endif /* _ASM_X86_TCE_H */
|
@ -146,7 +146,6 @@ ifeq ($(CONFIG_X86_64),y)
|
||||
obj-$(CONFIG_AUDIT) += audit_64.o
|
||||
|
||||
obj-$(CONFIG_GART_IOMMU) += amd_gart_64.o aperture_64.o
|
||||
obj-$(CONFIG_CALGARY_IOMMU) += pci-calgary_64.o tce_64.o
|
||||
|
||||
obj-$(CONFIG_MMCONF_FAM10H) += mmconf-fam10h_64.o
|
||||
obj-y += vsmp_64.o
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,6 @@
|
||||
#include <asm/dma.h>
|
||||
#include <asm/iommu.h>
|
||||
#include <asm/gart.h>
|
||||
#include <asm/calgary.h>
|
||||
#include <asm/x86_init.h>
|
||||
#include <asm/iommu_table.h>
|
||||
|
||||
@ -112,11 +111,6 @@ static __init int iommu_setup(char *p)
|
||||
|
||||
gart_parse_options(p);
|
||||
|
||||
#ifdef CONFIG_CALGARY_IOMMU
|
||||
if (!strncmp(p, "calgary", 7))
|
||||
use_calgary = 1;
|
||||
#endif /* CONFIG_CALGARY_IOMMU */
|
||||
|
||||
p += strcspn(p, ",");
|
||||
if (*p == ',')
|
||||
++p;
|
||||
|
@ -1,177 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* This file manages the translation entries for the IBM Calgary IOMMU.
|
||||
*
|
||||
* Derived from arch/powerpc/platforms/pseries/iommu.c
|
||||
*
|
||||
* Copyright (C) IBM Corporation, 2006
|
||||
*
|
||||
* Author: Jon Mason <jdmason@us.ibm.com>
|
||||
* Author: Muli Ben-Yehuda <muli@il.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <asm/tce.h>
|
||||
#include <asm/calgary.h>
|
||||
#include <asm/proto.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
/* flush a tce at 'tceaddr' to main memory */
|
||||
static inline void flush_tce(void* tceaddr)
|
||||
{
|
||||
/* a single tce can't cross a cache line */
|
||||
if (boot_cpu_has(X86_FEATURE_CLFLUSH))
|
||||
clflush(tceaddr);
|
||||
else
|
||||
wbinvd();
|
||||
}
|
||||
|
||||
void tce_build(struct iommu_table *tbl, unsigned long index,
|
||||
unsigned int npages, unsigned long uaddr, int direction)
|
||||
{
|
||||
u64* tp;
|
||||
u64 t;
|
||||
u64 rpn;
|
||||
|
||||
t = (1 << TCE_READ_SHIFT);
|
||||
if (direction != DMA_TO_DEVICE)
|
||||
t |= (1 << TCE_WRITE_SHIFT);
|
||||
|
||||
tp = ((u64*)tbl->it_base) + index;
|
||||
|
||||
while (npages--) {
|
||||
rpn = (virt_to_bus((void*)uaddr)) >> PAGE_SHIFT;
|
||||
t &= ~TCE_RPN_MASK;
|
||||
t |= (rpn << TCE_RPN_SHIFT);
|
||||
|
||||
*tp = cpu_to_be64(t);
|
||||
flush_tce(tp);
|
||||
|
||||
uaddr += PAGE_SIZE;
|
||||
tp++;
|
||||
}
|
||||
}
|
||||
|
||||
void tce_free(struct iommu_table *tbl, long index, unsigned int npages)
|
||||
{
|
||||
u64* tp;
|
||||
|
||||
tp = ((u64*)tbl->it_base) + index;
|
||||
|
||||
while (npages--) {
|
||||
*tp = cpu_to_be64(0);
|
||||
flush_tce(tp);
|
||||
tp++;
|
||||
}
|
||||
}
|
||||
|
||||
static inline unsigned int table_size_to_number_of_entries(unsigned char size)
|
||||
{
|
||||
/*
|
||||
* size is the order of the table, 0-7
|
||||
* smallest table is 8K entries, so shift result by 13 to
|
||||
* multiply by 8K
|
||||
*/
|
||||
return (1 << size) << 13;
|
||||
}
|
||||
|
||||
static int tce_table_setparms(struct pci_dev *dev, struct iommu_table *tbl)
|
||||
{
|
||||
unsigned int bitmapsz;
|
||||
unsigned long bmppages;
|
||||
int ret;
|
||||
|
||||
tbl->it_busno = dev->bus->number;
|
||||
|
||||
/* set the tce table size - measured in entries */
|
||||
tbl->it_size = table_size_to_number_of_entries(specified_table_size);
|
||||
|
||||
/*
|
||||
* number of bytes needed for the bitmap size in number of
|
||||
* entries; we need one bit per entry
|
||||
*/
|
||||
bitmapsz = tbl->it_size / BITS_PER_BYTE;
|
||||
bmppages = __get_free_pages(GFP_KERNEL, get_order(bitmapsz));
|
||||
if (!bmppages) {
|
||||
printk(KERN_ERR "Calgary: cannot allocate bitmap\n");
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
tbl->it_map = (unsigned long*)bmppages;
|
||||
|
||||
memset(tbl->it_map, 0, bitmapsz);
|
||||
|
||||
tbl->it_hint = 0;
|
||||
|
||||
spin_lock_init(&tbl->it_lock);
|
||||
|
||||
return 0;
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int __init build_tce_table(struct pci_dev *dev, void __iomem *bbar)
|
||||
{
|
||||
struct iommu_table *tbl;
|
||||
int ret;
|
||||
|
||||
if (pci_iommu(dev->bus)) {
|
||||
printk(KERN_ERR "Calgary: dev %p has sysdata->iommu %p\n",
|
||||
dev, pci_iommu(dev->bus));
|
||||
BUG();
|
||||
}
|
||||
|
||||
tbl = kzalloc(sizeof(struct iommu_table), GFP_KERNEL);
|
||||
if (!tbl) {
|
||||
printk(KERN_ERR "Calgary: error allocating iommu_table\n");
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = tce_table_setparms(dev, tbl);
|
||||
if (ret)
|
||||
goto free_tbl;
|
||||
|
||||
tbl->bbar = bbar;
|
||||
|
||||
set_pci_iommu(dev->bus, tbl);
|
||||
|
||||
return 0;
|
||||
|
||||
free_tbl:
|
||||
kfree(tbl);
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
void * __init alloc_tce_table(void)
|
||||
{
|
||||
unsigned int size;
|
||||
|
||||
size = table_size_to_number_of_entries(specified_table_size);
|
||||
size *= TCE_ENTRY_SIZE;
|
||||
|
||||
return memblock_alloc_low(size, size);
|
||||
}
|
||||
|
||||
void __init free_tce_table(void *tbl)
|
||||
{
|
||||
unsigned int size;
|
||||
|
||||
if (!tbl)
|
||||
return;
|
||||
|
||||
size = table_size_to_number_of_entries(specified_table_size);
|
||||
size *= TCE_ENTRY_SIZE;
|
||||
|
||||
memblock_free(__pa(tbl), size);
|
||||
}
|
Loading…
Reference in New Issue
Block a user