e465058d55
This patch hooks Calgary into the build, the x86-64 IOMMU initialization paths, and introduces the Calgary specific bits. The implementation draws inspiration from both PPC (which has support for the same chip but requires firmware support which we don't have on x86-64) and gart. Calgary is different from gart in that it support a translation table per PHB, as opposed to the single gart aperture. Changes from previous version: * Addition of boot-time disablement for bus-level translation/isolation (e.g, enable userspace DMA for things like X) * Usage of newer IOMMU abstraction functions Signed-off-by: Muli Ben-Yehuda <muli@il.ibm.com> Signed-off-by: Jon Mason <jdmason@us.ibm.com> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
66 lines
2.2 KiB
C
66 lines
2.2 KiB
C
/*
|
|
* Derived from include/asm-powerpc/iommu.h
|
|
*
|
|
* Copyright (C) 2006 Jon Mason <jdmason@us.ibm.com>, IBM Corporation
|
|
* Copyright (C) 2006 Muli Ben-Yehuda <muli@il.ibm.com>, IBM Corporation
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef _ASM_X86_64_CALGARY_H
|
|
#define _ASM_X86_64_CALGARY_H
|
|
|
|
#include <linux/config.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/device.h>
|
|
#include <linux/dma-mapping.h>
|
|
#include <asm/types.h>
|
|
|
|
struct iommu_table {
|
|
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 */
|
|
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 */
|
|
void __iomem *bbar;
|
|
u64 tar_val;
|
|
struct timer_list watchdog_timer;
|
|
};
|
|
|
|
#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
|
|
|
|
#ifdef CONFIG_CALGARY_IOMMU
|
|
extern int calgary_iommu_init(void);
|
|
extern void detect_calgary(void);
|
|
#else
|
|
static inline int calgary_iommu_init(void) { return 1; }
|
|
static inline void detect_calgary(void) { return; }
|
|
#endif
|
|
|
|
static inline unsigned int bus_to_phb(unsigned char busno)
|
|
{
|
|
return ((busno % 15 == 0) ? 0 : busno / 2 + 1);
|
|
}
|
|
|
|
#endif /* _ASM_X86_64_CALGARY_H */
|