1 /*
2  * pci_dma.h
3  * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen IBM Corporation
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18  */
19 
20 #ifndef _PCI_DMA_H
21 #define _PCI_DMA_H
22 
23 #include <asm/types.h>
24 #include <linux/spinlock.h>
25 
26 /*
27  * NUM_TCE_LEVELS defines the largest contiguous block
28  * of dma (tce) space we can get.  NUM_TCE_LEVELS = 10
29  * allows up to 2**9 pages (512 * 4096) = 2 MB
30  */
31 #define NUM_TCE_LEVELS 10
32 
33 #define NO_TCE ((dma_addr_t)-1)
34 
35 /*
36  * Tces come in two formats, one for the virtual bus and a different
37  * format for PCI
38  */
39 #define TCE_VB  0
40 #define TCE_PCI 1
41 
42 union Tce {
43    	u64 wholeTce;
44 	struct {
45 		u64 cacheBits	:6;	/* Cache hash bits - not used */
46 		u64 rsvd	:6;
47 		u64 rpn		:40;	/* Absolute page number */
48 		u64 valid	:1;	/* Tce is valid (vb only) */
49 		u64 allIo	:1;	/* Tce is valid for all lps (vb only) */
50 		u64 lpIndex	:8;	/* LpIndex for user of TCE (vb only) */
51 		u64 pciWrite	:1;	/* Write allowed (pci only) */
52 		u64 readWrite	:1;	/* Read allowed (pci), Write allowed (vb) */
53 	} tceBits;
54 };
55 
56 struct Bitmap {
57 	unsigned long	numBits;
58 	unsigned long	numBytes;
59 	unsigned char * map;
60 };
61 
62 struct MultiLevelBitmap {
63 	unsigned long 	maxLevel;
64 	struct Bitmap 	level[NUM_TCE_LEVELS];
65 };
66 
67 struct TceTable {
68 	u64	busNumber;
69 	u64	size;
70 	u64	startOffset;
71 	u64     base;                   /* pSeries native only */
72 	u64	index;
73 	u64	tceType;
74 	spinlock_t lock;
75 	struct MultiLevelBitmap mlbm;
76 };
77 
78 struct TceTableManagerCB {
79 	u64	busNumber;		/* Bus number for this tce table */
80 	u64	start;			/* Will be NULL for secondary */
81 	u64	totalSize;		/* Size (in pages) of whole table */
82 	u64	startOffset;		/* Index into real tce table of the
83 					   start of our section */
84 	u64	size;			/* Size (in pages) of our section */
85 	u64	index;			/* Index of this tce table (token?) */
86 	u16	maxTceTableIndex;	/* Max num of tables for partition */
87 	u8	virtualBusFlag;		/* Flag to indicate virtual bus */
88  	u8	logicalSlot;		/* IOA Tce Slot Index */
89  	u8	rsvd[4];
90 };
91 
92 extern struct TceTable virtBusTceTable;	/* Tce table for virtual bus */
93 
94 extern void create_tce_tables(void);
95 extern void create_pci_bus_tce_table(unsigned long);
96 
97 void tce_init_pSeries(void);
98 void tce_init_iSeries(void);
99 
100 #endif
101