xref: /linux/arch/s390/include/asm/pci_dma.h (revision 828b35f60eb0148f994bb13e328df94578b07142)
1*828b35f6SJan Glauber #ifndef _ASM_S390_PCI_DMA_H
2*828b35f6SJan Glauber #define _ASM_S390_PCI_DMA_H
3*828b35f6SJan Glauber 
4*828b35f6SJan Glauber /* I/O Translation Anchor (IOTA) */
5*828b35f6SJan Glauber enum zpci_ioat_dtype {
6*828b35f6SJan Glauber 	ZPCI_IOTA_STO = 0,
7*828b35f6SJan Glauber 	ZPCI_IOTA_RTTO = 1,
8*828b35f6SJan Glauber 	ZPCI_IOTA_RSTO = 2,
9*828b35f6SJan Glauber 	ZPCI_IOTA_RFTO = 3,
10*828b35f6SJan Glauber 	ZPCI_IOTA_PFAA = 4,
11*828b35f6SJan Glauber 	ZPCI_IOTA_IOPFAA = 5,
12*828b35f6SJan Glauber 	ZPCI_IOTA_IOPTO = 7
13*828b35f6SJan Glauber };
14*828b35f6SJan Glauber 
15*828b35f6SJan Glauber #define ZPCI_IOTA_IOT_ENABLED		0x800UL
16*828b35f6SJan Glauber #define ZPCI_IOTA_DT_ST			(ZPCI_IOTA_STO	<< 2)
17*828b35f6SJan Glauber #define ZPCI_IOTA_DT_RT			(ZPCI_IOTA_RTTO << 2)
18*828b35f6SJan Glauber #define ZPCI_IOTA_DT_RS			(ZPCI_IOTA_RSTO << 2)
19*828b35f6SJan Glauber #define ZPCI_IOTA_DT_RF			(ZPCI_IOTA_RFTO << 2)
20*828b35f6SJan Glauber #define ZPCI_IOTA_DT_PF			(ZPCI_IOTA_PFAA << 2)
21*828b35f6SJan Glauber #define ZPCI_IOTA_FS_4K			0
22*828b35f6SJan Glauber #define ZPCI_IOTA_FS_1M			1
23*828b35f6SJan Glauber #define ZPCI_IOTA_FS_2G			2
24*828b35f6SJan Glauber #define ZPCI_KEY			(PAGE_DEFAULT_KEY << 5)
25*828b35f6SJan Glauber 
26*828b35f6SJan Glauber #define ZPCI_IOTA_STO_FLAG	(ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_ST)
27*828b35f6SJan Glauber #define ZPCI_IOTA_RTTO_FLAG	(ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_RT)
28*828b35f6SJan Glauber #define ZPCI_IOTA_RSTO_FLAG	(ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_RS)
29*828b35f6SJan Glauber #define ZPCI_IOTA_RFTO_FLAG	(ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_RF)
30*828b35f6SJan Glauber #define ZPCI_IOTA_RFAA_FLAG	(ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_PF | ZPCI_IOTA_FS_2G)
31*828b35f6SJan Glauber 
32*828b35f6SJan Glauber /* I/O Region and segment tables */
33*828b35f6SJan Glauber #define ZPCI_INDEX_MASK			0x7ffUL
34*828b35f6SJan Glauber 
35*828b35f6SJan Glauber #define ZPCI_TABLE_TYPE_MASK		0xc
36*828b35f6SJan Glauber #define ZPCI_TABLE_TYPE_RFX		0xc
37*828b35f6SJan Glauber #define ZPCI_TABLE_TYPE_RSX		0x8
38*828b35f6SJan Glauber #define ZPCI_TABLE_TYPE_RTX		0x4
39*828b35f6SJan Glauber #define ZPCI_TABLE_TYPE_SX		0x0
40*828b35f6SJan Glauber 
41*828b35f6SJan Glauber #define ZPCI_TABLE_LEN_RFX		0x3
42*828b35f6SJan Glauber #define ZPCI_TABLE_LEN_RSX		0x3
43*828b35f6SJan Glauber #define ZPCI_TABLE_LEN_RTX		0x3
44*828b35f6SJan Glauber 
45*828b35f6SJan Glauber #define ZPCI_TABLE_OFFSET_MASK		0xc0
46*828b35f6SJan Glauber #define ZPCI_TABLE_SIZE			0x4000
47*828b35f6SJan Glauber #define ZPCI_TABLE_ALIGN		ZPCI_TABLE_SIZE
48*828b35f6SJan Glauber #define ZPCI_TABLE_ENTRY_SIZE		(sizeof(unsigned long))
49*828b35f6SJan Glauber #define ZPCI_TABLE_ENTRIES		(ZPCI_TABLE_SIZE / ZPCI_TABLE_ENTRY_SIZE)
50*828b35f6SJan Glauber 
51*828b35f6SJan Glauber #define ZPCI_TABLE_BITS			11
52*828b35f6SJan Glauber #define ZPCI_PT_BITS			8
53*828b35f6SJan Glauber #define ZPCI_ST_SHIFT			(ZPCI_PT_BITS + PAGE_SHIFT)
54*828b35f6SJan Glauber #define ZPCI_RT_SHIFT			(ZPCI_ST_SHIFT + ZPCI_TABLE_BITS)
55*828b35f6SJan Glauber 
56*828b35f6SJan Glauber #define ZPCI_RTE_FLAG_MASK		0x3fffUL
57*828b35f6SJan Glauber #define ZPCI_RTE_ADDR_MASK		(~ZPCI_RTE_FLAG_MASK)
58*828b35f6SJan Glauber #define ZPCI_STE_FLAG_MASK		0x7ffUL
59*828b35f6SJan Glauber #define ZPCI_STE_ADDR_MASK		(~ZPCI_STE_FLAG_MASK)
60*828b35f6SJan Glauber 
61*828b35f6SJan Glauber /* I/O Page tables */
62*828b35f6SJan Glauber #define ZPCI_PTE_VALID_MASK		0x400
63*828b35f6SJan Glauber #define ZPCI_PTE_INVALID		0x400
64*828b35f6SJan Glauber #define ZPCI_PTE_VALID			0x000
65*828b35f6SJan Glauber #define ZPCI_PT_SIZE			0x800
66*828b35f6SJan Glauber #define ZPCI_PT_ALIGN			ZPCI_PT_SIZE
67*828b35f6SJan Glauber #define ZPCI_PT_ENTRIES			(ZPCI_PT_SIZE / ZPCI_TABLE_ENTRY_SIZE)
68*828b35f6SJan Glauber #define ZPCI_PT_MASK			(ZPCI_PT_ENTRIES - 1)
69*828b35f6SJan Glauber 
70*828b35f6SJan Glauber #define ZPCI_PTE_FLAG_MASK		0xfffUL
71*828b35f6SJan Glauber #define ZPCI_PTE_ADDR_MASK		(~ZPCI_PTE_FLAG_MASK)
72*828b35f6SJan Glauber 
73*828b35f6SJan Glauber /* Shared bits */
74*828b35f6SJan Glauber #define ZPCI_TABLE_VALID		0x00
75*828b35f6SJan Glauber #define ZPCI_TABLE_INVALID		0x20
76*828b35f6SJan Glauber #define ZPCI_TABLE_PROTECTED		0x200
77*828b35f6SJan Glauber #define ZPCI_TABLE_UNPROTECTED		0x000
78*828b35f6SJan Glauber 
79*828b35f6SJan Glauber #define ZPCI_TABLE_VALID_MASK		0x20
80*828b35f6SJan Glauber #define ZPCI_TABLE_PROT_MASK		0x200
81*828b35f6SJan Glauber 
82*828b35f6SJan Glauber static inline unsigned int calc_rtx(dma_addr_t ptr)
83*828b35f6SJan Glauber {
84*828b35f6SJan Glauber 	return ((unsigned long) ptr >> ZPCI_RT_SHIFT) & ZPCI_INDEX_MASK;
85*828b35f6SJan Glauber }
86*828b35f6SJan Glauber 
87*828b35f6SJan Glauber static inline unsigned int calc_sx(dma_addr_t ptr)
88*828b35f6SJan Glauber {
89*828b35f6SJan Glauber 	return ((unsigned long) ptr >> ZPCI_ST_SHIFT) & ZPCI_INDEX_MASK;
90*828b35f6SJan Glauber }
91*828b35f6SJan Glauber 
92*828b35f6SJan Glauber static inline unsigned int calc_px(dma_addr_t ptr)
93*828b35f6SJan Glauber {
94*828b35f6SJan Glauber 	return ((unsigned long) ptr >> PAGE_SHIFT) & ZPCI_PT_MASK;
95*828b35f6SJan Glauber }
96*828b35f6SJan Glauber 
97*828b35f6SJan Glauber static inline void set_pt_pfaa(unsigned long *entry, void *pfaa)
98*828b35f6SJan Glauber {
99*828b35f6SJan Glauber 	*entry &= ZPCI_PTE_FLAG_MASK;
100*828b35f6SJan Glauber 	*entry |= ((unsigned long) pfaa & ZPCI_PTE_ADDR_MASK);
101*828b35f6SJan Glauber }
102*828b35f6SJan Glauber 
103*828b35f6SJan Glauber static inline void set_rt_sto(unsigned long *entry, void *sto)
104*828b35f6SJan Glauber {
105*828b35f6SJan Glauber 	*entry &= ZPCI_RTE_FLAG_MASK;
106*828b35f6SJan Glauber 	*entry |= ((unsigned long) sto & ZPCI_RTE_ADDR_MASK);
107*828b35f6SJan Glauber 	*entry |= ZPCI_TABLE_TYPE_RTX;
108*828b35f6SJan Glauber }
109*828b35f6SJan Glauber 
110*828b35f6SJan Glauber static inline void set_st_pto(unsigned long *entry, void *pto)
111*828b35f6SJan Glauber {
112*828b35f6SJan Glauber 	*entry &= ZPCI_STE_FLAG_MASK;
113*828b35f6SJan Glauber 	*entry |= ((unsigned long) pto & ZPCI_STE_ADDR_MASK);
114*828b35f6SJan Glauber 	*entry |= ZPCI_TABLE_TYPE_SX;
115*828b35f6SJan Glauber }
116*828b35f6SJan Glauber 
117*828b35f6SJan Glauber static inline void validate_rt_entry(unsigned long *entry)
118*828b35f6SJan Glauber {
119*828b35f6SJan Glauber 	*entry &= ~ZPCI_TABLE_VALID_MASK;
120*828b35f6SJan Glauber 	*entry &= ~ZPCI_TABLE_OFFSET_MASK;
121*828b35f6SJan Glauber 	*entry |= ZPCI_TABLE_VALID;
122*828b35f6SJan Glauber 	*entry |= ZPCI_TABLE_LEN_RTX;
123*828b35f6SJan Glauber }
124*828b35f6SJan Glauber 
125*828b35f6SJan Glauber static inline void validate_st_entry(unsigned long *entry)
126*828b35f6SJan Glauber {
127*828b35f6SJan Glauber 	*entry &= ~ZPCI_TABLE_VALID_MASK;
128*828b35f6SJan Glauber 	*entry |= ZPCI_TABLE_VALID;
129*828b35f6SJan Glauber }
130*828b35f6SJan Glauber 
131*828b35f6SJan Glauber static inline void invalidate_table_entry(unsigned long *entry)
132*828b35f6SJan Glauber {
133*828b35f6SJan Glauber 	*entry &= ~ZPCI_TABLE_VALID_MASK;
134*828b35f6SJan Glauber 	*entry |= ZPCI_TABLE_INVALID;
135*828b35f6SJan Glauber }
136*828b35f6SJan Glauber 
137*828b35f6SJan Glauber static inline void invalidate_pt_entry(unsigned long *entry)
138*828b35f6SJan Glauber {
139*828b35f6SJan Glauber 	WARN_ON_ONCE((*entry & ZPCI_PTE_VALID_MASK) == ZPCI_PTE_INVALID);
140*828b35f6SJan Glauber 	*entry &= ~ZPCI_PTE_VALID_MASK;
141*828b35f6SJan Glauber 	*entry |= ZPCI_PTE_INVALID;
142*828b35f6SJan Glauber }
143*828b35f6SJan Glauber 
144*828b35f6SJan Glauber static inline void validate_pt_entry(unsigned long *entry)
145*828b35f6SJan Glauber {
146*828b35f6SJan Glauber 	WARN_ON_ONCE((*entry & ZPCI_PTE_VALID_MASK) == ZPCI_PTE_VALID);
147*828b35f6SJan Glauber 	*entry &= ~ZPCI_PTE_VALID_MASK;
148*828b35f6SJan Glauber 	*entry |= ZPCI_PTE_VALID;
149*828b35f6SJan Glauber }
150*828b35f6SJan Glauber 
151*828b35f6SJan Glauber static inline void entry_set_protected(unsigned long *entry)
152*828b35f6SJan Glauber {
153*828b35f6SJan Glauber 	*entry &= ~ZPCI_TABLE_PROT_MASK;
154*828b35f6SJan Glauber 	*entry |= ZPCI_TABLE_PROTECTED;
155*828b35f6SJan Glauber }
156*828b35f6SJan Glauber 
157*828b35f6SJan Glauber static inline void entry_clr_protected(unsigned long *entry)
158*828b35f6SJan Glauber {
159*828b35f6SJan Glauber 	*entry &= ~ZPCI_TABLE_PROT_MASK;
160*828b35f6SJan Glauber 	*entry |= ZPCI_TABLE_UNPROTECTED;
161*828b35f6SJan Glauber }
162*828b35f6SJan Glauber 
163*828b35f6SJan Glauber static inline int reg_entry_isvalid(unsigned long entry)
164*828b35f6SJan Glauber {
165*828b35f6SJan Glauber 	return (entry & ZPCI_TABLE_VALID_MASK) == ZPCI_TABLE_VALID;
166*828b35f6SJan Glauber }
167*828b35f6SJan Glauber 
168*828b35f6SJan Glauber static inline int pt_entry_isvalid(unsigned long entry)
169*828b35f6SJan Glauber {
170*828b35f6SJan Glauber 	return (entry & ZPCI_PTE_VALID_MASK) == ZPCI_PTE_VALID;
171*828b35f6SJan Glauber }
172*828b35f6SJan Glauber 
173*828b35f6SJan Glauber static inline int entry_isprotected(unsigned long entry)
174*828b35f6SJan Glauber {
175*828b35f6SJan Glauber 	return (entry & ZPCI_TABLE_PROT_MASK) == ZPCI_TABLE_PROTECTED;
176*828b35f6SJan Glauber }
177*828b35f6SJan Glauber 
178*828b35f6SJan Glauber static inline unsigned long *get_rt_sto(unsigned long entry)
179*828b35f6SJan Glauber {
180*828b35f6SJan Glauber 	return ((entry & ZPCI_TABLE_TYPE_MASK) == ZPCI_TABLE_TYPE_RTX)
181*828b35f6SJan Glauber 		? (unsigned long *) (entry & ZPCI_RTE_ADDR_MASK)
182*828b35f6SJan Glauber 		: NULL;
183*828b35f6SJan Glauber }
184*828b35f6SJan Glauber 
185*828b35f6SJan Glauber static inline unsigned long *get_st_pto(unsigned long entry)
186*828b35f6SJan Glauber {
187*828b35f6SJan Glauber 	return ((entry & ZPCI_TABLE_TYPE_MASK) == ZPCI_TABLE_TYPE_SX)
188*828b35f6SJan Glauber 		? (unsigned long *) (entry & ZPCI_STE_ADDR_MASK)
189*828b35f6SJan Glauber 		: NULL;
190*828b35f6SJan Glauber }
191*828b35f6SJan Glauber 
192*828b35f6SJan Glauber /* Prototypes */
193*828b35f6SJan Glauber int zpci_dma_init_device(struct zpci_dev *);
194*828b35f6SJan Glauber void zpci_dma_exit_device(struct zpci_dev *);
195*828b35f6SJan Glauber 
196*828b35f6SJan Glauber #endif
197