Loading...
1/*
2 * This file is provided under a GPLv2 license. When using or
3 * redistributing this file, you may do so under that license.
4 *
5 * GPL LICENSE SUMMARY
6 *
7 * Copyright (C) 2016-2018 T-Platforms JSC All Rights Reserved.
8 *
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms and conditions of the GNU General Public License,
11 * version 2, as published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 * Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, one can be found http://www.gnu.org/licenses/.
20 *
21 * The full GNU General Public License is included in this distribution in
22 * the file called "COPYING".
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 *
36 * IDT PCIe-switch NTB Linux driver
37 *
38 * Contact Information:
39 * Serge Semin <fancer.lancer@gmail.com>, <Sergey.Semin@t-platforms.ru>
40 */
41
42#ifndef NTB_HW_IDT_H
43#define NTB_HW_IDT_H
44
45#include <linux/types.h>
46#include <linux/pci.h>
47#include <linux/pci_ids.h>
48#include <linux/interrupt.h>
49#include <linux/spinlock.h>
50#include <linux/mutex.h>
51#include <linux/ntb.h>
52
53/*
54 * Macro is used to create the struct pci_device_id that matches
55 * the supported IDT PCIe-switches
56 * @devname: Capitalized name of the particular device
57 * @data: Variable passed to the driver of the particular device
58 */
59#define IDT_PCI_DEVICE_IDS(devname, data) \
60 .vendor = PCI_VENDOR_ID_IDT, .device = PCI_DEVICE_ID_IDT_##devname, \
61 .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, \
62 .class = (PCI_CLASS_BRIDGE_OTHER << 8), .class_mask = (0xFFFF00), \
63 .driver_data = (kernel_ulong_t)&data
64
65/*
66 * IDT PCIe-switches device IDs
67 */
68#define PCI_DEVICE_ID_IDT_89HPES24NT6AG2 0x8091
69#define PCI_DEVICE_ID_IDT_89HPES32NT8AG2 0x808F
70#define PCI_DEVICE_ID_IDT_89HPES32NT8BG2 0x8088
71#define PCI_DEVICE_ID_IDT_89HPES12NT12G2 0x8092
72#define PCI_DEVICE_ID_IDT_89HPES16NT16G2 0x8090
73#define PCI_DEVICE_ID_IDT_89HPES24NT24G2 0x808E
74#define PCI_DEVICE_ID_IDT_89HPES32NT24AG2 0x808C
75#define PCI_DEVICE_ID_IDT_89HPES32NT24BG2 0x808A
76
77/*
78 * NT-function Configuration Space registers
79 * NOTE 1) The IDT PCIe-switch internal data is little-endian
80 * so it must be taken into account in the driver
81 * internals.
82 * 2) Additionally the registers should be accessed either
83 * with byte-enables corresponding to their native size or
84 * the size of one DWORD
85 *
86 * So to simplify the driver code, there is only DWORD-sized read/write
87 * operations utilized.
88 */
89/* PCI Express Configuration Space */
90/* PCI Express command/status register (DWORD) */
91#define IDT_NT_PCICMDSTS 0x00004U
92/* PCI Express Device Capabilities (DWORD) */
93#define IDT_NT_PCIEDCAP 0x00044U
94/* PCI Express Device Control/Status (WORD+WORD) */
95#define IDT_NT_PCIEDCTLSTS 0x00048U
96/* PCI Express Link Capabilities (DWORD) */
97#define IDT_NT_PCIELCAP 0x0004CU
98/* PCI Express Link Control/Status (WORD+WORD) */
99#define IDT_NT_PCIELCTLSTS 0x00050U
100/* PCI Express Device Capabilities 2 (DWORD) */
101#define IDT_NT_PCIEDCAP2 0x00064U
102/* PCI Express Device Control 2 (WORD+WORD) */
103#define IDT_NT_PCIEDCTL2 0x00068U
104/* PCI Power Management Control and Status (DWORD) */
105#define IDT_NT_PMCSR 0x000C4U
106/*==========================================*/
107/* IDT Proprietary NT-port-specific registers */
108/* NT-function main control registers */
109/* NT Endpoint Control (DWORD) */
110#define IDT_NT_NTCTL 0x00400U
111/* NT Endpoint Interrupt Status/Mask (DWORD) */
112#define IDT_NT_NTINTSTS 0x00404U
113#define IDT_NT_NTINTMSK 0x00408U
114/* NT Endpoint Signal Data (DWORD) */
115#define IDT_NT_NTSDATA 0x0040CU
116/* NT Endpoint Global Signal (DWORD) */
117#define IDT_NT_NTGSIGNAL 0x00410U
118/* Internal Error Reporting Mask 0/1 (DWORD) */
119#define IDT_NT_NTIERRORMSK0 0x00414U
120#define IDT_NT_NTIERRORMSK1 0x00418U
121/* Doorbel registers */
122/* NT Outbound Doorbell Set (DWORD) */
123#define IDT_NT_OUTDBELLSET 0x00420U
124/* NT Inbound Doorbell Status/Mask (DWORD) */
125#define IDT_NT_INDBELLSTS 0x00428U
126#define IDT_NT_INDBELLMSK 0x0042CU
127/* Message registers */
128/* Outbound Message N (DWORD) */
129#define IDT_NT_OUTMSG0 0x00430U
130#define IDT_NT_OUTMSG1 0x00434U
131#define IDT_NT_OUTMSG2 0x00438U
132#define IDT_NT_OUTMSG3 0x0043CU
133/* Inbound Message N (DWORD) */
134#define IDT_NT_INMSG0 0x00440U
135#define IDT_NT_INMSG1 0x00444U
136#define IDT_NT_INMSG2 0x00448U
137#define IDT_NT_INMSG3 0x0044CU
138/* Inbound Message Source N (DWORD) */
139#define IDT_NT_INMSGSRC0 0x00450U
140#define IDT_NT_INMSGSRC1 0x00454U
141#define IDT_NT_INMSGSRC2 0x00458U
142#define IDT_NT_INMSGSRC3 0x0045CU
143/* Message Status (DWORD) */
144#define IDT_NT_MSGSTS 0x00460U
145/* Message Status Mask (DWORD) */
146#define IDT_NT_MSGSTSMSK 0x00464U
147/* BAR-setup registers */
148/* BAR N Setup/Limit Address/Lower and Upper Translated Base Address (DWORD) */
149#define IDT_NT_BARSETUP0 0x00470U
150#define IDT_NT_BARLIMIT0 0x00474U
151#define IDT_NT_BARLTBASE0 0x00478U
152#define IDT_NT_BARUTBASE0 0x0047CU
153#define IDT_NT_BARSETUP1 0x00480U
154#define IDT_NT_BARLIMIT1 0x00484U
155#define IDT_NT_BARLTBASE1 0x00488U
156#define IDT_NT_BARUTBASE1 0x0048CU
157#define IDT_NT_BARSETUP2 0x00490U
158#define IDT_NT_BARLIMIT2 0x00494U
159#define IDT_NT_BARLTBASE2 0x00498U
160#define IDT_NT_BARUTBASE2 0x0049CU
161#define IDT_NT_BARSETUP3 0x004A0U
162#define IDT_NT_BARLIMIT3 0x004A4U
163#define IDT_NT_BARLTBASE3 0x004A8U
164#define IDT_NT_BARUTBASE3 0x004ACU
165#define IDT_NT_BARSETUP4 0x004B0U
166#define IDT_NT_BARLIMIT4 0x004B4U
167#define IDT_NT_BARLTBASE4 0x004B8U
168#define IDT_NT_BARUTBASE4 0x004BCU
169#define IDT_NT_BARSETUP5 0x004C0U
170#define IDT_NT_BARLIMIT5 0x004C4U
171#define IDT_NT_BARLTBASE5 0x004C8U
172#define IDT_NT_BARUTBASE5 0x004CCU
173/* NT mapping table registers */
174/* NT Mapping Table Address/Status/Data (DWORD) */
175#define IDT_NT_NTMTBLADDR 0x004D0U
176#define IDT_NT_NTMTBLSTS 0x004D4U
177#define IDT_NT_NTMTBLDATA 0x004D8U
178/* Requester ID (Bus:Device:Function) Capture (DWORD) */
179#define IDT_NT_REQIDCAP 0x004DCU
180/* Memory Windows Lookup table registers */
181/* Lookup Table Offset/Lower, Middle and Upper data (DWORD) */
182#define IDT_NT_LUTOFFSET 0x004E0U
183#define IDT_NT_LUTLDATA 0x004E4U
184#define IDT_NT_LUTMDATA 0x004E8U
185#define IDT_NT_LUTUDATA 0x004ECU
186/* NT Endpoint Uncorrectable/Correctable Errors Emulation registers (DWORD) */
187#define IDT_NT_NTUEEM 0x004F0U
188#define IDT_NT_NTCEEM 0x004F4U
189/* Global Address Space Access/Data registers (DWARD) */
190#define IDT_NT_GASAADDR 0x00FF8U
191#define IDT_NT_GASADATA 0x00FFCU
192
193/*
194 * IDT PCIe-switch Global Configuration and Status registers
195 */
196/* Port N Configuration register in global space */
197/* PCI Express command/status and link control/status registers (WORD+WORD) */
198#define IDT_SW_NTP0_PCIECMDSTS 0x01004U
199#define IDT_SW_NTP0_PCIELCTLSTS 0x01050U
200/* NT-function control register (DWORD) */
201#define IDT_SW_NTP0_NTCTL 0x01400U
202/* BAR setup/limit/base address registers (DWORD) */
203#define IDT_SW_NTP0_BARSETUP0 0x01470U
204#define IDT_SW_NTP0_BARLIMIT0 0x01474U
205#define IDT_SW_NTP0_BARLTBASE0 0x01478U
206#define IDT_SW_NTP0_BARUTBASE0 0x0147CU
207#define IDT_SW_NTP0_BARSETUP1 0x01480U
208#define IDT_SW_NTP0_BARLIMIT1 0x01484U
209#define IDT_SW_NTP0_BARLTBASE1 0x01488U
210#define IDT_SW_NTP0_BARUTBASE1 0x0148CU
211#define IDT_SW_NTP0_BARSETUP2 0x01490U
212#define IDT_SW_NTP0_BARLIMIT2 0x01494U
213#define IDT_SW_NTP0_BARLTBASE2 0x01498U
214#define IDT_SW_NTP0_BARUTBASE2 0x0149CU
215#define IDT_SW_NTP0_BARSETUP3 0x014A0U
216#define IDT_SW_NTP0_BARLIMIT3 0x014A4U
217#define IDT_SW_NTP0_BARLTBASE3 0x014A8U
218#define IDT_SW_NTP0_BARUTBASE3 0x014ACU
219#define IDT_SW_NTP0_BARSETUP4 0x014B0U
220#define IDT_SW_NTP0_BARLIMIT4 0x014B4U
221#define IDT_SW_NTP0_BARLTBASE4 0x014B8U
222#define IDT_SW_NTP0_BARUTBASE4 0x014BCU
223#define IDT_SW_NTP0_BARSETUP5 0x014C0U
224#define IDT_SW_NTP0_BARLIMIT5 0x014C4U
225#define IDT_SW_NTP0_BARLTBASE5 0x014C8U
226#define IDT_SW_NTP0_BARUTBASE5 0x014CCU
227/* PCI Express command/status and link control/status registers (WORD+WORD) */
228#define IDT_SW_NTP2_PCIECMDSTS 0x05004U
229#define IDT_SW_NTP2_PCIELCTLSTS 0x05050U
230/* NT-function control register (DWORD) */
231#define IDT_SW_NTP2_NTCTL 0x05400U
232/* BAR setup/limit/base address registers (DWORD) */
233#define IDT_SW_NTP2_BARSETUP0 0x05470U
234#define IDT_SW_NTP2_BARLIMIT0 0x05474U
235#define IDT_SW_NTP2_BARLTBASE0 0x05478U
236#define IDT_SW_NTP2_BARUTBASE0 0x0547CU
237#define IDT_SW_NTP2_BARSETUP1 0x05480U
238#define IDT_SW_NTP2_BARLIMIT1 0x05484U
239#define IDT_SW_NTP2_BARLTBASE1 0x05488U
240#define IDT_SW_NTP2_BARUTBASE1 0x0548CU
241#define IDT_SW_NTP2_BARSETUP2 0x05490U
242#define IDT_SW_NTP2_BARLIMIT2 0x05494U
243#define IDT_SW_NTP2_BARLTBASE2 0x05498U
244#define IDT_SW_NTP2_BARUTBASE2 0x0549CU
245#define IDT_SW_NTP2_BARSETUP3 0x054A0U
246#define IDT_SW_NTP2_BARLIMIT3 0x054A4U
247#define IDT_SW_NTP2_BARLTBASE3 0x054A8U
248#define IDT_SW_NTP2_BARUTBASE3 0x054ACU
249#define IDT_SW_NTP2_BARSETUP4 0x054B0U
250#define IDT_SW_NTP2_BARLIMIT4 0x054B4U
251#define IDT_SW_NTP2_BARLTBASE4 0x054B8U
252#define IDT_SW_NTP2_BARUTBASE4 0x054BCU
253#define IDT_SW_NTP2_BARSETUP5 0x054C0U
254#define IDT_SW_NTP2_BARLIMIT5 0x054C4U
255#define IDT_SW_NTP2_BARLTBASE5 0x054C8U
256#define IDT_SW_NTP2_BARUTBASE5 0x054CCU
257/* PCI Express command/status and link control/status registers (WORD+WORD) */
258#define IDT_SW_NTP4_PCIECMDSTS 0x09004U
259#define IDT_SW_NTP4_PCIELCTLSTS 0x09050U
260/* NT-function control register (DWORD) */
261#define IDT_SW_NTP4_NTCTL 0x09400U
262/* BAR setup/limit/base address registers (DWORD) */
263#define IDT_SW_NTP4_BARSETUP0 0x09470U
264#define IDT_SW_NTP4_BARLIMIT0 0x09474U
265#define IDT_SW_NTP4_BARLTBASE0 0x09478U
266#define IDT_SW_NTP4_BARUTBASE0 0x0947CU
267#define IDT_SW_NTP4_BARSETUP1 0x09480U
268#define IDT_SW_NTP4_BARLIMIT1 0x09484U
269#define IDT_SW_NTP4_BARLTBASE1 0x09488U
270#define IDT_SW_NTP4_BARUTBASE1 0x0948CU
271#define IDT_SW_NTP4_BARSETUP2 0x09490U
272#define IDT_SW_NTP4_BARLIMIT2 0x09494U
273#define IDT_SW_NTP4_BARLTBASE2 0x09498U
274#define IDT_SW_NTP4_BARUTBASE2 0x0949CU
275#define IDT_SW_NTP4_BARSETUP3 0x094A0U
276#define IDT_SW_NTP4_BARLIMIT3 0x094A4U
277#define IDT_SW_NTP4_BARLTBASE3 0x094A8U
278#define IDT_SW_NTP4_BARUTBASE3 0x094ACU
279#define IDT_SW_NTP4_BARSETUP4 0x094B0U
280#define IDT_SW_NTP4_BARLIMIT4 0x094B4U
281#define IDT_SW_NTP4_BARLTBASE4 0x094B8U
282#define IDT_SW_NTP4_BARUTBASE4 0x094BCU
283#define IDT_SW_NTP4_BARSETUP5 0x094C0U
284#define IDT_SW_NTP4_BARLIMIT5 0x094C4U
285#define IDT_SW_NTP4_BARLTBASE5 0x094C8U
286#define IDT_SW_NTP4_BARUTBASE5 0x094CCU
287/* PCI Express command/status and link control/status registers (WORD+WORD) */
288#define IDT_SW_NTP6_PCIECMDSTS 0x0D004U
289#define IDT_SW_NTP6_PCIELCTLSTS 0x0D050U
290/* NT-function control register (DWORD) */
291#define IDT_SW_NTP6_NTCTL 0x0D400U
292/* BAR setup/limit/base address registers (DWORD) */
293#define IDT_SW_NTP6_BARSETUP0 0x0D470U
294#define IDT_SW_NTP6_BARLIMIT0 0x0D474U
295#define IDT_SW_NTP6_BARLTBASE0 0x0D478U
296#define IDT_SW_NTP6_BARUTBASE0 0x0D47CU
297#define IDT_SW_NTP6_BARSETUP1 0x0D480U
298#define IDT_SW_NTP6_BARLIMIT1 0x0D484U
299#define IDT_SW_NTP6_BARLTBASE1 0x0D488U
300#define IDT_SW_NTP6_BARUTBASE1 0x0D48CU
301#define IDT_SW_NTP6_BARSETUP2 0x0D490U
302#define IDT_SW_NTP6_BARLIMIT2 0x0D494U
303#define IDT_SW_NTP6_BARLTBASE2 0x0D498U
304#define IDT_SW_NTP6_BARUTBASE2 0x0D49CU
305#define IDT_SW_NTP6_BARSETUP3 0x0D4A0U
306#define IDT_SW_NTP6_BARLIMIT3 0x0D4A4U
307#define IDT_SW_NTP6_BARLTBASE3 0x0D4A8U
308#define IDT_SW_NTP6_BARUTBASE3 0x0D4ACU
309#define IDT_SW_NTP6_BARSETUP4 0x0D4B0U
310#define IDT_SW_NTP6_BARLIMIT4 0x0D4B4U
311#define IDT_SW_NTP6_BARLTBASE4 0x0D4B8U
312#define IDT_SW_NTP6_BARUTBASE4 0x0D4BCU
313#define IDT_SW_NTP6_BARSETUP5 0x0D4C0U
314#define IDT_SW_NTP6_BARLIMIT5 0x0D4C4U
315#define IDT_SW_NTP6_BARLTBASE5 0x0D4C8U
316#define IDT_SW_NTP6_BARUTBASE5 0x0D4CCU
317/* PCI Express command/status and link control/status registers (WORD+WORD) */
318#define IDT_SW_NTP8_PCIECMDSTS 0x11004U
319#define IDT_SW_NTP8_PCIELCTLSTS 0x11050U
320/* NT-function control register (DWORD) */
321#define IDT_SW_NTP8_NTCTL 0x11400U
322/* BAR setup/limit/base address registers (DWORD) */
323#define IDT_SW_NTP8_BARSETUP0 0x11470U
324#define IDT_SW_NTP8_BARLIMIT0 0x11474U
325#define IDT_SW_NTP8_BARLTBASE0 0x11478U
326#define IDT_SW_NTP8_BARUTBASE0 0x1147CU
327#define IDT_SW_NTP8_BARSETUP1 0x11480U
328#define IDT_SW_NTP8_BARLIMIT1 0x11484U
329#define IDT_SW_NTP8_BARLTBASE1 0x11488U
330#define IDT_SW_NTP8_BARUTBASE1 0x1148CU
331#define IDT_SW_NTP8_BARSETUP2 0x11490U
332#define IDT_SW_NTP8_BARLIMIT2 0x11494U
333#define IDT_SW_NTP8_BARLTBASE2 0x11498U
334#define IDT_SW_NTP8_BARUTBASE2 0x1149CU
335#define IDT_SW_NTP8_BARSETUP3 0x114A0U
336#define IDT_SW_NTP8_BARLIMIT3 0x114A4U
337#define IDT_SW_NTP8_BARLTBASE3 0x114A8U
338#define IDT_SW_NTP8_BARUTBASE3 0x114ACU
339#define IDT_SW_NTP8_BARSETUP4 0x114B0U
340#define IDT_SW_NTP8_BARLIMIT4 0x114B4U
341#define IDT_SW_NTP8_BARLTBASE4 0x114B8U
342#define IDT_SW_NTP8_BARUTBASE4 0x114BCU
343#define IDT_SW_NTP8_BARSETUP5 0x114C0U
344#define IDT_SW_NTP8_BARLIMIT5 0x114C4U
345#define IDT_SW_NTP8_BARLTBASE5 0x114C8U
346#define IDT_SW_NTP8_BARUTBASE5 0x114CCU
347/* PCI Express command/status and link control/status registers (WORD+WORD) */
348#define IDT_SW_NTP12_PCIECMDSTS 0x19004U
349#define IDT_SW_NTP12_PCIELCTLSTS 0x19050U
350/* NT-function control register (DWORD) */
351#define IDT_SW_NTP12_NTCTL 0x19400U
352/* BAR setup/limit/base address registers (DWORD) */
353#define IDT_SW_NTP12_BARSETUP0 0x19470U
354#define IDT_SW_NTP12_BARLIMIT0 0x19474U
355#define IDT_SW_NTP12_BARLTBASE0 0x19478U
356#define IDT_SW_NTP12_BARUTBASE0 0x1947CU
357#define IDT_SW_NTP12_BARSETUP1 0x19480U
358#define IDT_SW_NTP12_BARLIMIT1 0x19484U
359#define IDT_SW_NTP12_BARLTBASE1 0x19488U
360#define IDT_SW_NTP12_BARUTBASE1 0x1948CU
361#define IDT_SW_NTP12_BARSETUP2 0x19490U
362#define IDT_SW_NTP12_BARLIMIT2 0x19494U
363#define IDT_SW_NTP12_BARLTBASE2 0x19498U
364#define IDT_SW_NTP12_BARUTBASE2 0x1949CU
365#define IDT_SW_NTP12_BARSETUP3 0x194A0U
366#define IDT_SW_NTP12_BARLIMIT3 0x194A4U
367#define IDT_SW_NTP12_BARLTBASE3 0x194A8U
368#define IDT_SW_NTP12_BARUTBASE3 0x194ACU
369#define IDT_SW_NTP12_BARSETUP4 0x194B0U
370#define IDT_SW_NTP12_BARLIMIT4 0x194B4U
371#define IDT_SW_NTP12_BARLTBASE4 0x194B8U
372#define IDT_SW_NTP12_BARUTBASE4 0x194BCU
373#define IDT_SW_NTP12_BARSETUP5 0x194C0U
374#define IDT_SW_NTP12_BARLIMIT5 0x194C4U
375#define IDT_SW_NTP12_BARLTBASE5 0x194C8U
376#define IDT_SW_NTP12_BARUTBASE5 0x194CCU
377/* PCI Express command/status and link control/status registers (WORD+WORD) */
378#define IDT_SW_NTP16_PCIECMDSTS 0x21004U
379#define IDT_SW_NTP16_PCIELCTLSTS 0x21050U
380/* NT-function control register (DWORD) */
381#define IDT_SW_NTP16_NTCTL 0x21400U
382/* BAR setup/limit/base address registers (DWORD) */
383#define IDT_SW_NTP16_BARSETUP0 0x21470U
384#define IDT_SW_NTP16_BARLIMIT0 0x21474U
385#define IDT_SW_NTP16_BARLTBASE0 0x21478U
386#define IDT_SW_NTP16_BARUTBASE0 0x2147CU
387#define IDT_SW_NTP16_BARSETUP1 0x21480U
388#define IDT_SW_NTP16_BARLIMIT1 0x21484U
389#define IDT_SW_NTP16_BARLTBASE1 0x21488U
390#define IDT_SW_NTP16_BARUTBASE1 0x2148CU
391#define IDT_SW_NTP16_BARSETUP2 0x21490U
392#define IDT_SW_NTP16_BARLIMIT2 0x21494U
393#define IDT_SW_NTP16_BARLTBASE2 0x21498U
394#define IDT_SW_NTP16_BARUTBASE2 0x2149CU
395#define IDT_SW_NTP16_BARSETUP3 0x214A0U
396#define IDT_SW_NTP16_BARLIMIT3 0x214A4U
397#define IDT_SW_NTP16_BARLTBASE3 0x214A8U
398#define IDT_SW_NTP16_BARUTBASE3 0x214ACU
399#define IDT_SW_NTP16_BARSETUP4 0x214B0U
400#define IDT_SW_NTP16_BARLIMIT4 0x214B4U
401#define IDT_SW_NTP16_BARLTBASE4 0x214B8U
402#define IDT_SW_NTP16_BARUTBASE4 0x214BCU
403#define IDT_SW_NTP16_BARSETUP5 0x214C0U
404#define IDT_SW_NTP16_BARLIMIT5 0x214C4U
405#define IDT_SW_NTP16_BARLTBASE5 0x214C8U
406#define IDT_SW_NTP16_BARUTBASE5 0x214CCU
407/* PCI Express command/status and link control/status registers (WORD+WORD) */
408#define IDT_SW_NTP20_PCIECMDSTS 0x29004U
409#define IDT_SW_NTP20_PCIELCTLSTS 0x29050U
410/* NT-function control register (DWORD) */
411#define IDT_SW_NTP20_NTCTL 0x29400U
412/* BAR setup/limit/base address registers (DWORD) */
413#define IDT_SW_NTP20_BARSETUP0 0x29470U
414#define IDT_SW_NTP20_BARLIMIT0 0x29474U
415#define IDT_SW_NTP20_BARLTBASE0 0x29478U
416#define IDT_SW_NTP20_BARUTBASE0 0x2947CU
417#define IDT_SW_NTP20_BARSETUP1 0x29480U
418#define IDT_SW_NTP20_BARLIMIT1 0x29484U
419#define IDT_SW_NTP20_BARLTBASE1 0x29488U
420#define IDT_SW_NTP20_BARUTBASE1 0x2948CU
421#define IDT_SW_NTP20_BARSETUP2 0x29490U
422#define IDT_SW_NTP20_BARLIMIT2 0x29494U
423#define IDT_SW_NTP20_BARLTBASE2 0x29498U
424#define IDT_SW_NTP20_BARUTBASE2 0x2949CU
425#define IDT_SW_NTP20_BARSETUP3 0x294A0U
426#define IDT_SW_NTP20_BARLIMIT3 0x294A4U
427#define IDT_SW_NTP20_BARLTBASE3 0x294A8U
428#define IDT_SW_NTP20_BARUTBASE3 0x294ACU
429#define IDT_SW_NTP20_BARSETUP4 0x294B0U
430#define IDT_SW_NTP20_BARLIMIT4 0x294B4U
431#define IDT_SW_NTP20_BARLTBASE4 0x294B8U
432#define IDT_SW_NTP20_BARUTBASE4 0x294BCU
433#define IDT_SW_NTP20_BARSETUP5 0x294C0U
434#define IDT_SW_NTP20_BARLIMIT5 0x294C4U
435#define IDT_SW_NTP20_BARLTBASE5 0x294C8U
436#define IDT_SW_NTP20_BARUTBASE5 0x294CCU
437/* IDT PCIe-switch control register (DWORD) */
438#define IDT_SW_CTL 0x3E000U
439/* Boot Configuration Vector Status (DWORD) */
440#define IDT_SW_BCVSTS 0x3E004U
441/* Port Clocking Mode (DWORD) */
442#define IDT_SW_PCLKMODE 0x3E008U
443/* Reset Drain Delay (DWORD) */
444#define IDT_SW_RDRAINDELAY 0x3E080U
445/* Port Operating Mode Change Drain Delay (DWORD) */
446#define IDT_SW_POMCDELAY 0x3E084U
447/* Side Effect Delay (DWORD) */
448#define IDT_SW_SEDELAY 0x3E088U
449/* Upstream Secondary Bus Reset Delay (DWORD) */
450#define IDT_SW_SSBRDELAY 0x3E08CU
451/* Switch partition N Control/Status/Failover registers */
452#define IDT_SW_SWPART0CTL 0x3E100U
453#define IDT_SW_SWPART0STS 0x3E104U
454#define IDT_SW_SWPART0FCTL 0x3E108U
455#define IDT_SW_SWPART1CTL 0x3E120U
456#define IDT_SW_SWPART1STS 0x3E124U
457#define IDT_SW_SWPART1FCTL 0x3E128U
458#define IDT_SW_SWPART2CTL 0x3E140U
459#define IDT_SW_SWPART2STS 0x3E144U
460#define IDT_SW_SWPART2FCTL 0x3E148U
461#define IDT_SW_SWPART3CTL 0x3E160U
462#define IDT_SW_SWPART3STS 0x3E164U
463#define IDT_SW_SWPART3FCTL 0x3E168U
464#define IDT_SW_SWPART4CTL 0x3E180U
465#define IDT_SW_SWPART4STS 0x3E184U
466#define IDT_SW_SWPART4FCTL 0x3E188U
467#define IDT_SW_SWPART5CTL 0x3E1A0U
468#define IDT_SW_SWPART5STS 0x3E1A4U
469#define IDT_SW_SWPART5FCTL 0x3E1A8U
470#define IDT_SW_SWPART6CTL 0x3E1C0U
471#define IDT_SW_SWPART6STS 0x3E1C4U
472#define IDT_SW_SWPART6FCTL 0x3E1C8U
473#define IDT_SW_SWPART7CTL 0x3E1E0U
474#define IDT_SW_SWPART7STS 0x3E1E4U
475#define IDT_SW_SWPART7FCTL 0x3E1E8U
476/* Switch port N control and status registers */
477#define IDT_SW_SWPORT0CTL 0x3E200U
478#define IDT_SW_SWPORT0STS 0x3E204U
479#define IDT_SW_SWPORT0FCTL 0x3E208U
480#define IDT_SW_SWPORT2CTL 0x3E240U
481#define IDT_SW_SWPORT2STS 0x3E244U
482#define IDT_SW_SWPORT2FCTL 0x3E248U
483#define IDT_SW_SWPORT4CTL 0x3E280U
484#define IDT_SW_SWPORT4STS 0x3E284U
485#define IDT_SW_SWPORT4FCTL 0x3E288U
486#define IDT_SW_SWPORT6CTL 0x3E2C0U
487#define IDT_SW_SWPORT6STS 0x3E2C4U
488#define IDT_SW_SWPORT6FCTL 0x3E2C8U
489#define IDT_SW_SWPORT8CTL 0x3E300U
490#define IDT_SW_SWPORT8STS 0x3E304U
491#define IDT_SW_SWPORT8FCTL 0x3E308U
492#define IDT_SW_SWPORT12CTL 0x3E380U
493#define IDT_SW_SWPORT12STS 0x3E384U
494#define IDT_SW_SWPORT12FCTL 0x3E388U
495#define IDT_SW_SWPORT16CTL 0x3E400U
496#define IDT_SW_SWPORT16STS 0x3E404U
497#define IDT_SW_SWPORT16FCTL 0x3E408U
498#define IDT_SW_SWPORT20CTL 0x3E480U
499#define IDT_SW_SWPORT20STS 0x3E484U
500#define IDT_SW_SWPORT20FCTL 0x3E488U
501/* Switch Event registers */
502/* Switch Event Status/Mask/Partition mask (DWORD) */
503#define IDT_SW_SESTS 0x3EC00U
504#define IDT_SW_SEMSK 0x3EC04U
505#define IDT_SW_SEPMSK 0x3EC08U
506/* Switch Event Link Up/Down Status/Mask (DWORD) */
507#define IDT_SW_SELINKUPSTS 0x3EC0CU
508#define IDT_SW_SELINKUPMSK 0x3EC10U
509#define IDT_SW_SELINKDNSTS 0x3EC14U
510#define IDT_SW_SELINKDNMSK 0x3EC18U
511/* Switch Event Fundamental Reset Status/Mask (DWORD) */
512#define IDT_SW_SEFRSTSTS 0x3EC1CU
513#define IDT_SW_SEFRSTMSK 0x3EC20U
514/* Switch Event Hot Reset Status/Mask (DWORD) */
515#define IDT_SW_SEHRSTSTS 0x3EC24U
516#define IDT_SW_SEHRSTMSK 0x3EC28U
517/* Switch Event Failover Mask (DWORD) */
518#define IDT_SW_SEFOVRMSK 0x3EC2CU
519/* Switch Event Global Signal Status/Mask (DWORD) */
520#define IDT_SW_SEGSIGSTS 0x3EC30U
521#define IDT_SW_SEGSIGMSK 0x3EC34U
522/* NT Global Doorbell Status (DWORD) */
523#define IDT_SW_GDBELLSTS 0x3EC3CU
524/* Switch partition N message M control (msgs routing table) (DWORD) */
525#define IDT_SW_SWP0MSGCTL0 0x3EE00U
526#define IDT_SW_SWP1MSGCTL0 0x3EE04U
527#define IDT_SW_SWP2MSGCTL0 0x3EE08U
528#define IDT_SW_SWP3MSGCTL0 0x3EE0CU
529#define IDT_SW_SWP4MSGCTL0 0x3EE10U
530#define IDT_SW_SWP5MSGCTL0 0x3EE14U
531#define IDT_SW_SWP6MSGCTL0 0x3EE18U
532#define IDT_SW_SWP7MSGCTL0 0x3EE1CU
533#define IDT_SW_SWP0MSGCTL1 0x3EE20U
534#define IDT_SW_SWP1MSGCTL1 0x3EE24U
535#define IDT_SW_SWP2MSGCTL1 0x3EE28U
536#define IDT_SW_SWP3MSGCTL1 0x3EE2CU
537#define IDT_SW_SWP4MSGCTL1 0x3EE30U
538#define IDT_SW_SWP5MSGCTL1 0x3EE34U
539#define IDT_SW_SWP6MSGCTL1 0x3EE38U
540#define IDT_SW_SWP7MSGCTL1 0x3EE3CU
541#define IDT_SW_SWP0MSGCTL2 0x3EE40U
542#define IDT_SW_SWP1MSGCTL2 0x3EE44U
543#define IDT_SW_SWP2MSGCTL2 0x3EE48U
544#define IDT_SW_SWP3MSGCTL2 0x3EE4CU
545#define IDT_SW_SWP4MSGCTL2 0x3EE50U
546#define IDT_SW_SWP5MSGCTL2 0x3EE54U
547#define IDT_SW_SWP6MSGCTL2 0x3EE58U
548#define IDT_SW_SWP7MSGCTL2 0x3EE5CU
549#define IDT_SW_SWP0MSGCTL3 0x3EE60U
550#define IDT_SW_SWP1MSGCTL3 0x3EE64U
551#define IDT_SW_SWP2MSGCTL3 0x3EE68U
552#define IDT_SW_SWP3MSGCTL3 0x3EE6CU
553#define IDT_SW_SWP4MSGCTL3 0x3EE70U
554#define IDT_SW_SWP5MSGCTL3 0x3EE74U
555#define IDT_SW_SWP6MSGCTL3 0x3EE78U
556#define IDT_SW_SWP7MSGCTL3 0x3EE7CU
557/* SMBus Status and Control registers (DWORD) */
558#define IDT_SW_SMBUSSTS 0x3F188U
559#define IDT_SW_SMBUSCTL 0x3F18CU
560/* Serial EEPROM Interface (DWORD) */
561#define IDT_SW_EEPROMINTF 0x3F190U
562/* MBus I/O Expander Address N (DWORD) */
563#define IDT_SW_IOEXPADDR0 0x3F198U
564#define IDT_SW_IOEXPADDR1 0x3F19CU
565#define IDT_SW_IOEXPADDR2 0x3F1A0U
566#define IDT_SW_IOEXPADDR3 0x3F1A4U
567#define IDT_SW_IOEXPADDR4 0x3F1A8U
568#define IDT_SW_IOEXPADDR5 0x3F1ACU
569/* General Purpose Events Control and Status registers (DWORD) */
570#define IDT_SW_GPECTL 0x3F1B0U
571#define IDT_SW_GPESTS 0x3F1B4U
572/* Temperature sensor Control/Status/Alarm/Adjustment/Slope registers */
573#define IDT_SW_TMPCTL 0x3F1D4U
574#define IDT_SW_TMPSTS 0x3F1D8U
575#define IDT_SW_TMPALARM 0x3F1DCU
576#define IDT_SW_TMPADJ 0x3F1E0U
577#define IDT_SW_TSSLOPE 0x3F1E4U
578/* SMBus Configuration Block header log (DWORD) */
579#define IDT_SW_SMBUSCBHL 0x3F1E8U
580
581/*
582 * Common registers related constants
583 * @IDT_REG_ALIGN: Registers alignment used in the driver
584 * @IDT_REG_PCI_MAX: Maximum PCI configuration space register value
585 * @IDT_REG_SW_MAX: Maximum global register value
586 */
587#define IDT_REG_ALIGN 4
588#define IDT_REG_PCI_MAX 0x00FFFU
589#define IDT_REG_SW_MAX 0x3FFFFU
590
591/*
592 * PCICMDSTS register fields related constants
593 * @IDT_PCICMDSTS_IOAE: I/O access enable
594 * @IDT_PCICMDSTS_MAE: Memory access enable
595 * @IDT_PCICMDSTS_BME: Bus master enable
596 */
597#define IDT_PCICMDSTS_IOAE 0x00000001U
598#define IDT_PCICMDSTS_MAE 0x00000002U
599#define IDT_PCICMDSTS_BME 0x00000004U
600
601/*
602 * PCIEDCAP register fields related constants
603 * @IDT_PCIEDCAP_MPAYLOAD_MASK: Maximum payload size mask
604 * @IDT_PCIEDCAP_MPAYLOAD_FLD: Maximum payload size field offset
605 * @IDT_PCIEDCAP_MPAYLOAD_S128: Max supported payload size of 128 bytes
606 * @IDT_PCIEDCAP_MPAYLOAD_S256: Max supported payload size of 256 bytes
607 * @IDT_PCIEDCAP_MPAYLOAD_S512: Max supported payload size of 512 bytes
608 * @IDT_PCIEDCAP_MPAYLOAD_S1024: Max supported payload size of 1024 bytes
609 * @IDT_PCIEDCAP_MPAYLOAD_S2048: Max supported payload size of 2048 bytes
610 */
611#define IDT_PCIEDCAP_MPAYLOAD_MASK 0x00000007U
612#define IDT_PCIEDCAP_MPAYLOAD_FLD 0
613#define IDT_PCIEDCAP_MPAYLOAD_S128 0x00000000U
614#define IDT_PCIEDCAP_MPAYLOAD_S256 0x00000001U
615#define IDT_PCIEDCAP_MPAYLOAD_S512 0x00000002U
616#define IDT_PCIEDCAP_MPAYLOAD_S1024 0x00000003U
617#define IDT_PCIEDCAP_MPAYLOAD_S2048 0x00000004U
618
619/*
620 * PCIEDCTLSTS registers fields related constants
621 * @IDT_PCIEDCTL_MPS_MASK: Maximum payload size mask
622 * @IDT_PCIEDCTL_MPS_FLD: MPS field offset
623 * @IDT_PCIEDCTL_MPS_S128: Max payload size of 128 bytes
624 * @IDT_PCIEDCTL_MPS_S256: Max payload size of 256 bytes
625 * @IDT_PCIEDCTL_MPS_S512: Max payload size of 512 bytes
626 * @IDT_PCIEDCTL_MPS_S1024: Max payload size of 1024 bytes
627 * @IDT_PCIEDCTL_MPS_S2048: Max payload size of 2048 bytes
628 * @IDT_PCIEDCTL_MPS_S4096: Max payload size of 4096 bytes
629 */
630#define IDT_PCIEDCTLSTS_MPS_MASK 0x000000E0U
631#define IDT_PCIEDCTLSTS_MPS_FLD 5
632#define IDT_PCIEDCTLSTS_MPS_S128 0x00000000U
633#define IDT_PCIEDCTLSTS_MPS_S256 0x00000020U
634#define IDT_PCIEDCTLSTS_MPS_S512 0x00000040U
635#define IDT_PCIEDCTLSTS_MPS_S1024 0x00000060U
636#define IDT_PCIEDCTLSTS_MPS_S2048 0x00000080U
637#define IDT_PCIEDCTLSTS_MPS_S4096 0x000000A0U
638
639/*
640 * PCIELCAP register fields related constants
641 * @IDT_PCIELCAP_PORTNUM_MASK: Port number field mask
642 * @IDT_PCIELCAP_PORTNUM_FLD: Port number field offset
643 */
644#define IDT_PCIELCAP_PORTNUM_MASK 0xFF000000U
645#define IDT_PCIELCAP_PORTNUM_FLD 24
646
647/*
648 * PCIELCTLSTS registers fields related constants
649 * @IDT_PCIELSTS_CLS_MASK: Current link speed mask
650 * @IDT_PCIELSTS_CLS_FLD: Current link speed field offset
651 * @IDT_PCIELSTS_NLW_MASK: Negotiated link width mask
652 * @IDT_PCIELSTS_NLW_FLD: Negotiated link width field offset
653 * @IDT_PCIELSTS_SCLK_COM: Common slot clock configuration
654 */
655#define IDT_PCIELCTLSTS_CLS_MASK 0x000F0000U
656#define IDT_PCIELCTLSTS_CLS_FLD 16
657#define IDT_PCIELCTLSTS_NLW_MASK 0x03F00000U
658#define IDT_PCIELCTLSTS_NLW_FLD 20
659#define IDT_PCIELCTLSTS_SCLK_COM 0x10000000U
660
661/*
662 * NTCTL register fields related constants
663 * @IDT_NTCTL_IDPROTDIS: ID Protection check disable (disable MTBL)
664 * @IDT_NTCTL_CPEN: Completion enable
665 * @IDT_NTCTL_RNS: Request no snoop processing (if MTBL disabled)
666 * @IDT_NTCTL_ATP: Address type processing (if MTBL disabled)
667 */
668#define IDT_NTCTL_IDPROTDIS 0x00000001U
669#define IDT_NTCTL_CPEN 0x00000002U
670#define IDT_NTCTL_RNS 0x00000004U
671#define IDT_NTCTL_ATP 0x00000008U
672
673/*
674 * NTINTSTS register fields related constants
675 * @IDT_NTINTSTS_MSG: Message interrupt bit
676 * @IDT_NTINTSTS_DBELL: Doorbell interrupt bit
677 * @IDT_NTINTSTS_SEVENT: Switch Event interrupt bit
678 * @IDT_NTINTSTS_TMPSENSOR: Temperature sensor interrupt bit
679 */
680#define IDT_NTINTSTS_MSG 0x00000001U
681#define IDT_NTINTSTS_DBELL 0x00000002U
682#define IDT_NTINTSTS_SEVENT 0x00000008U
683#define IDT_NTINTSTS_TMPSENSOR 0x00000080U
684
685/*
686 * NTINTMSK register fields related constants
687 * @IDT_NTINTMSK_MSG: Message interrupt mask bit
688 * @IDT_NTINTMSK_DBELL: Doorbell interrupt mask bit
689 * @IDT_NTINTMSK_SEVENT: Switch Event interrupt mask bit
690 * @IDT_NTINTMSK_TMPSENSOR: Temperature sensor interrupt mask bit
691 * @IDT_NTINTMSK_ALL: NTB-related interrupts mask
692 */
693#define IDT_NTINTMSK_MSG 0x00000001U
694#define IDT_NTINTMSK_DBELL 0x00000002U
695#define IDT_NTINTMSK_SEVENT 0x00000008U
696#define IDT_NTINTMSK_TMPSENSOR 0x00000080U
697#define IDT_NTINTMSK_ALL \
698 (IDT_NTINTMSK_MSG | IDT_NTINTMSK_DBELL | IDT_NTINTMSK_SEVENT)
699
700/*
701 * NTGSIGNAL register fields related constants
702 * @IDT_NTGSIGNAL_SET: Set global signal of the local partition
703 */
704#define IDT_NTGSIGNAL_SET 0x00000001U
705
706/*
707 * BARSETUP register fields related constants
708 * @IDT_BARSETUP_TYPE_MASK: Mask of the TYPE field
709 * @IDT_BARSETUP_TYPE_32: 32-bit addressing BAR
710 * @IDT_BARSETUP_TYPE_64: 64-bit addressing BAR
711 * @IDT_BARSETUP_PREF: Value of the BAR prefetchable field
712 * @IDT_BARSETUP_SIZE_MASK: Mask of the SIZE field
713 * @IDT_BARSETUP_SIZE_FLD: SIZE field offset
714 * @IDT_BARSETUP_SIZE_CFG: SIZE field value in case of config space MODE
715 * @IDT_BARSETUP_MODE_CFG: Configuration space BAR mode
716 * @IDT_BARSETUP_ATRAN_MASK: ATRAN field mask
717 * @IDT_BARSETUP_ATRAN_FLD: ATRAN field offset
718 * @IDT_BARSETUP_ATRAN_DIR: Direct address translation memory window
719 * @IDT_BARSETUP_ATRAN_LUT12: 12-entry lookup table
720 * @IDT_BARSETUP_ATRAN_LUT24: 24-entry lookup table
721 * @IDT_BARSETUP_TPART_MASK: TPART field mask
722 * @IDT_BARSETUP_TPART_FLD: TPART field offset
723 * @IDT_BARSETUP_EN: BAR enable bit
724 */
725#define IDT_BARSETUP_TYPE_MASK 0x00000006U
726#define IDT_BARSETUP_TYPE_FLD 0
727#define IDT_BARSETUP_TYPE_32 0x00000000U
728#define IDT_BARSETUP_TYPE_64 0x00000004U
729#define IDT_BARSETUP_PREF 0x00000008U
730#define IDT_BARSETUP_SIZE_MASK 0x000003F0U
731#define IDT_BARSETUP_SIZE_FLD 4
732#define IDT_BARSETUP_SIZE_CFG 0x000000C0U
733#define IDT_BARSETUP_MODE_CFG 0x00000400U
734#define IDT_BARSETUP_ATRAN_MASK 0x00001800U
735#define IDT_BARSETUP_ATRAN_FLD 11
736#define IDT_BARSETUP_ATRAN_DIR 0x00000000U
737#define IDT_BARSETUP_ATRAN_LUT12 0x00000800U
738#define IDT_BARSETUP_ATRAN_LUT24 0x00001000U
739#define IDT_BARSETUP_TPART_MASK 0x0000E000U
740#define IDT_BARSETUP_TPART_FLD 13
741#define IDT_BARSETUP_EN 0x80000000U
742
743/*
744 * NTMTBLDATA register fields related constants
745 * @IDT_NTMTBLDATA_VALID: Set the MTBL entry being valid
746 * @IDT_NTMTBLDATA_REQID_MASK: Bus:Device:Function field mask
747 * @IDT_NTMTBLDATA_REQID_FLD: Bus:Device:Function field offset
748 * @IDT_NTMTBLDATA_PART_MASK: Partition field mask
749 * @IDT_NTMTBLDATA_PART_FLD: Partition field offset
750 * @IDT_NTMTBLDATA_ATP_TRANS: Enable AT field translation on request TLPs
751 * @IDT_NTMTBLDATA_CNS_INV: Enable No Snoop attribute inversion of
752 * Completion TLPs
753 * @IDT_NTMTBLDATA_RNS_INV: Enable No Snoop attribute inversion of
754 * Request TLPs
755 */
756#define IDT_NTMTBLDATA_VALID 0x00000001U
757#define IDT_NTMTBLDATA_REQID_MASK 0x0001FFFEU
758#define IDT_NTMTBLDATA_REQID_FLD 1
759#define IDT_NTMTBLDATA_PART_MASK 0x000E0000U
760#define IDT_NTMTBLDATA_PART_FLD 17
761#define IDT_NTMTBLDATA_ATP_TRANS 0x20000000U
762#define IDT_NTMTBLDATA_CNS_INV 0x40000000U
763#define IDT_NTMTBLDATA_RNS_INV 0x80000000U
764
765/*
766 * REQIDCAP register fields related constants
767 * @IDT_REQIDCAP_REQID_MASK: Request ID field mask
768 * @IDT_REQIDCAP_REQID_FLD: Request ID field offset
769 */
770#define IDT_REQIDCAP_REQID_MASK 0x0000FFFFU
771#define IDT_REQIDCAP_REQID_FLD 0
772
773/*
774 * LUTOFFSET register fields related constants
775 * @IDT_LUTOFFSET_INDEX_MASK: Lookup table index field mask
776 * @IDT_LUTOFFSET_INDEX_FLD: Lookup table index field offset
777 * @IDT_LUTOFFSET_BAR_MASK: Lookup table BAR select field mask
778 * @IDT_LUTOFFSET_BAR_FLD: Lookup table BAR select field offset
779 */
780#define IDT_LUTOFFSET_INDEX_MASK 0x0000001FU
781#define IDT_LUTOFFSET_INDEX_FLD 0
782#define IDT_LUTOFFSET_BAR_MASK 0x00000700U
783#define IDT_LUTOFFSET_BAR_FLD 8
784
785/*
786 * LUTUDATA register fields related constants
787 * @IDT_LUTUDATA_PART_MASK: Partition field mask
788 * @IDT_LUTUDATA_PART_FLD: Partition field offset
789 * @IDT_LUTUDATA_VALID: Lookup table entry valid bit
790 */
791#define IDT_LUTUDATA_PART_MASK 0x0000000FU
792#define IDT_LUTUDATA_PART_FLD 0
793#define IDT_LUTUDATA_VALID 0x80000000U
794
795/*
796 * SWPARTxSTS register fields related constants
797 * @IDT_SWPARTxSTS_SCI: Switch partition state change initiated
798 * @IDT_SWPARTxSTS_SCC: Switch partition state change completed
799 * @IDT_SWPARTxSTS_STATE_MASK: Switch partition state mask
800 * @IDT_SWPARTxSTS_STATE_FLD: Switch partition state field offset
801 * @IDT_SWPARTxSTS_STATE_DIS: Switch partition disabled
802 * @IDT_SWPARTxSTS_STATE_ACT: Switch partition enabled
803 * @IDT_SWPARTxSTS_STATE_RES: Switch partition in reset
804 * @IDT_SWPARTxSTS_US: Switch partition has upstream port
805 * @IDT_SWPARTxSTS_USID_MASK: Switch partition upstream port ID mask
806 * @IDT_SWPARTxSTS_USID_FLD: Switch partition upstream port ID field offset
807 * @IDT_SWPARTxSTS_NT: Upstream port has NT function
808 * @IDT_SWPARTxSTS_DMA: Upstream port has DMA function
809 */
810#define IDT_SWPARTxSTS_SCI 0x00000001U
811#define IDT_SWPARTxSTS_SCC 0x00000002U
812#define IDT_SWPARTxSTS_STATE_MASK 0x00000060U
813#define IDT_SWPARTxSTS_STATE_FLD 5
814#define IDT_SWPARTxSTS_STATE_DIS 0x00000000U
815#define IDT_SWPARTxSTS_STATE_ACT 0x00000020U
816#define IDT_SWPARTxSTS_STATE_RES 0x00000060U
817#define IDT_SWPARTxSTS_US 0x00000100U
818#define IDT_SWPARTxSTS_USID_MASK 0x00003E00U
819#define IDT_SWPARTxSTS_USID_FLD 9
820#define IDT_SWPARTxSTS_NT 0x00004000U
821#define IDT_SWPARTxSTS_DMA 0x00008000U
822
823/*
824 * SWPORTxSTS register fields related constants
825 * @IDT_SWPORTxSTS_OMCI: Operation mode change initiated
826 * @IDT_SWPORTxSTS_OMCC: Operation mode change completed
827 * @IDT_SWPORTxSTS_LINKUP: Link up status
828 * @IDT_SWPORTxSTS_DS: Port lanes behave as downstream lanes
829 * @IDT_SWPORTxSTS_MODE_MASK: Port mode field mask
830 * @IDT_SWPORTxSTS_MODE_FLD: Port mode field offset
831 * @IDT_SWPORTxSTS_MODE_DIS: Port mode - disabled
832 * @IDT_SWPORTxSTS_MODE_DS: Port mode - downstream switch port
833 * @IDT_SWPORTxSTS_MODE_US: Port mode - upstream switch port
834 * @IDT_SWPORTxSTS_MODE_NT: Port mode - NT function
835 * @IDT_SWPORTxSTS_MODE_USNT: Port mode - upstream switch port with NTB
836 * @IDT_SWPORTxSTS_MODE_UNAT: Port mode - unattached
837 * @IDT_SWPORTxSTS_MODE_USDMA: Port mode - upstream switch port with DMA
838 * @IDT_SWPORTxSTS_MODE_USNTDMA:Port mode - upstream port with NTB and DMA
839 * @IDT_SWPORTxSTS_MODE_NTDMA: Port mode - NT function with DMA
840 * @IDT_SWPORTxSTS_SWPART_MASK: Port partition field mask
841 * @IDT_SWPORTxSTS_SWPART_FLD: Port partition field offset
842 * @IDT_SWPORTxSTS_DEVNUM_MASK: Port device number field mask
843 * @IDT_SWPORTxSTS_DEVNUM_FLD: Port device number field offset
844 */
845#define IDT_SWPORTxSTS_OMCI 0x00000001U
846#define IDT_SWPORTxSTS_OMCC 0x00000002U
847#define IDT_SWPORTxSTS_LINKUP 0x00000010U
848#define IDT_SWPORTxSTS_DS 0x00000020U
849#define IDT_SWPORTxSTS_MODE_MASK 0x000003C0U
850#define IDT_SWPORTxSTS_MODE_FLD 6
851#define IDT_SWPORTxSTS_MODE_DIS 0x00000000U
852#define IDT_SWPORTxSTS_MODE_DS 0x00000040U
853#define IDT_SWPORTxSTS_MODE_US 0x00000080U
854#define IDT_SWPORTxSTS_MODE_NT 0x000000C0U
855#define IDT_SWPORTxSTS_MODE_USNT 0x00000100U
856#define IDT_SWPORTxSTS_MODE_UNAT 0x00000140U
857#define IDT_SWPORTxSTS_MODE_USDMA 0x00000180U
858#define IDT_SWPORTxSTS_MODE_USNTDMA 0x000001C0U
859#define IDT_SWPORTxSTS_MODE_NTDMA 0x00000200U
860#define IDT_SWPORTxSTS_SWPART_MASK 0x00001C00U
861#define IDT_SWPORTxSTS_SWPART_FLD 10
862#define IDT_SWPORTxSTS_DEVNUM_MASK 0x001F0000U
863#define IDT_SWPORTxSTS_DEVNUM_FLD 16
864
865/*
866 * SEMSK register fields related constants
867 * @IDT_SEMSK_LINKUP: Link Up event mask bit
868 * @IDT_SEMSK_LINKDN: Link Down event mask bit
869 * @IDT_SEMSK_GSIGNAL: Global Signal event mask bit
870 */
871#define IDT_SEMSK_LINKUP 0x00000001U
872#define IDT_SEMSK_LINKDN 0x00000002U
873#define IDT_SEMSK_GSIGNAL 0x00000020U
874
875/*
876 * SWPxMSGCTL register fields related constants
877 * @IDT_SWPxMSGCTL_REG_MASK: Register select field mask
878 * @IDT_SWPxMSGCTL_REG_FLD: Register select field offset
879 * @IDT_SWPxMSGCTL_PART_MASK: Partition select field mask
880 * @IDT_SWPxMSGCTL_PART_FLD: Partition select field offset
881 */
882#define IDT_SWPxMSGCTL_REG_MASK 0x00000003U
883#define IDT_SWPxMSGCTL_REG_FLD 0
884#define IDT_SWPxMSGCTL_PART_MASK 0x00000070U
885#define IDT_SWPxMSGCTL_PART_FLD 4
886
887/*
888 * TMPCTL register fields related constants
889 * @IDT_TMPCTL_LTH_MASK: Low temperature threshold field mask
890 * @IDT_TMPCTL_LTH_FLD: Low temperature threshold field offset
891 * @IDT_TMPCTL_MTH_MASK: Middle temperature threshold field mask
892 * @IDT_TMPCTL_MTH_FLD: Middle temperature threshold field offset
893 * @IDT_TMPCTL_HTH_MASK: High temperature threshold field mask
894 * @IDT_TMPCTL_HTH_FLD: High temperature threshold field offset
895 * @IDT_TMPCTL_PDOWN: Temperature sensor power down
896 */
897#define IDT_TMPCTL_LTH_MASK 0x000000FFU
898#define IDT_TMPCTL_LTH_FLD 0
899#define IDT_TMPCTL_MTH_MASK 0x0000FF00U
900#define IDT_TMPCTL_MTH_FLD 8
901#define IDT_TMPCTL_HTH_MASK 0x00FF0000U
902#define IDT_TMPCTL_HTH_FLD 16
903#define IDT_TMPCTL_PDOWN 0x80000000U
904
905/*
906 * TMPSTS register fields related constants
907 * @IDT_TMPSTS_TEMP_MASK: Current temperature field mask
908 * @IDT_TMPSTS_TEMP_FLD: Current temperature field offset
909 * @IDT_TMPSTS_LTEMP_MASK: Lowest temperature field mask
910 * @IDT_TMPSTS_LTEMP_FLD: Lowest temperature field offset
911 * @IDT_TMPSTS_HTEMP_MASK: Highest temperature field mask
912 * @IDT_TMPSTS_HTEMP_FLD: Highest temperature field offset
913 */
914#define IDT_TMPSTS_TEMP_MASK 0x000000FFU
915#define IDT_TMPSTS_TEMP_FLD 0
916#define IDT_TMPSTS_LTEMP_MASK 0x0000FF00U
917#define IDT_TMPSTS_LTEMP_FLD 8
918#define IDT_TMPSTS_HTEMP_MASK 0x00FF0000U
919#define IDT_TMPSTS_HTEMP_FLD 16
920
921/*
922 * TMPALARM register fields related constants
923 * @IDT_TMPALARM_LTEMP_MASK: Lowest temperature field mask
924 * @IDT_TMPALARM_LTEMP_FLD: Lowest temperature field offset
925 * @IDT_TMPALARM_HTEMP_MASK: Highest temperature field mask
926 * @IDT_TMPALARM_HTEMP_FLD: Highest temperature field offset
927 * @IDT_TMPALARM_IRQ_MASK: Alarm IRQ status mask
928 */
929#define IDT_TMPALARM_LTEMP_MASK 0x0000FF00U
930#define IDT_TMPALARM_LTEMP_FLD 8
931#define IDT_TMPALARM_HTEMP_MASK 0x00FF0000U
932#define IDT_TMPALARM_HTEMP_FLD 16
933#define IDT_TMPALARM_IRQ_MASK 0x3F000000U
934
935/*
936 * TMPADJ register fields related constants
937 * @IDT_TMPADJ_OFFSET_MASK: Temperature value offset field mask
938 * @IDT_TMPADJ_OFFSET_FLD: Temperature value offset field offset
939 */
940#define IDT_TMPADJ_OFFSET_MASK 0x000000FFU
941#define IDT_TMPADJ_OFFSET_FLD 0
942
943/*
944 * Helper macro to get/set the corresponding field value
945 * @GET_FIELD: Retrieve the value of the corresponding field
946 * @SET_FIELD: Set the specified field up
947 * @IS_FLD_SET: Check whether a field is set with value
948 */
949#define GET_FIELD(field, data) \
950 (((u32)(data) & IDT_ ##field## _MASK) >> IDT_ ##field## _FLD)
951#define SET_FIELD(field, data, value) \
952 (((u32)(data) & ~IDT_ ##field## _MASK) | \
953 ((u32)(value) << IDT_ ##field## _FLD))
954#define IS_FLD_SET(field, data, value) \
955 (((u32)(data) & IDT_ ##field## _MASK) == IDT_ ##field## _ ##value)
956
957/*
958 * Useful registers masks:
959 * @IDT_DBELL_MASK: Doorbell bits mask
960 * @IDT_OUTMSG_MASK: Out messages status bits mask
961 * @IDT_INMSG_MASK: In messages status bits mask
962 * @IDT_MSG_MASK: Any message status bits mask
963 */
964#define IDT_DBELL_MASK ((u32)0xFFFFFFFFU)
965#define IDT_OUTMSG_MASK ((u32)0x0000000FU)
966#define IDT_INMSG_MASK ((u32)0x000F0000U)
967#define IDT_MSG_MASK (IDT_INMSG_MASK | IDT_OUTMSG_MASK)
968
969/*
970 * Number of IDT NTB resources:
971 * @IDT_MSG_CNT: Number of Message registers
972 * @IDT_BAR_CNT: Number of BARs of each port
973 * @IDT_MTBL_ENTRY_CNT: Number mapping table entries
974 */
975#define IDT_MSG_CNT 4
976#define IDT_BAR_CNT 6
977#define IDT_MTBL_ENTRY_CNT 64
978
979/*
980 * General IDT PCIe-switch constant
981 * @IDT_MAX_NR_PORTS: Maximum number of ports per IDT PCIe-switch
982 * @IDT_MAX_NR_PARTS: Maximum number of partitions per IDT PCIe-switch
983 * @IDT_MAX_NR_PEERS: Maximum number of NT-peers per IDT PCIe-switch
984 * @IDT_MAX_NR_MWS: Maximum number of Memory Widows
985 * @IDT_PCIE_REGSIZE: Size of the registers in bytes
986 * @IDT_TRANS_ALIGN: Alignment of translated base address
987 * @IDT_DIR_SIZE_ALIGN: Alignment of size setting for direct translated MWs.
988 * Even though the lower 10 bits are reserved, they are
989 * treated by IDT as one's so basically there is no any
990 * alignment of size limit for DIR address translation.
991 */
992#define IDT_MAX_NR_PORTS 24
993#define IDT_MAX_NR_PARTS 8
994#define IDT_MAX_NR_PEERS 8
995#define IDT_MAX_NR_MWS 29
996#define IDT_PCIE_REGSIZE 4
997#define IDT_TRANS_ALIGN 4
998#define IDT_DIR_SIZE_ALIGN 1
999
1000/*
1001 * IDT PCIe-switch temperature sensor value limits
1002 * @IDT_TEMP_MIN_MDEG: Minimal integer value of temperature
1003 * @IDT_TEMP_MAX_MDEG: Maximal integer value of temperature
1004 * @IDT_TEMP_MIN_OFFSET:Minimal integer value of temperature offset
1005 * @IDT_TEMP_MAX_OFFSET:Maximal integer value of temperature offset
1006 */
1007#define IDT_TEMP_MIN_MDEG 0
1008#define IDT_TEMP_MAX_MDEG 127500
1009#define IDT_TEMP_MIN_OFFSET -64000
1010#define IDT_TEMP_MAX_OFFSET 63500
1011
1012/*
1013 * Temperature sensor values enumeration
1014 * @IDT_TEMP_CUR: Current temperature
1015 * @IDT_TEMP_LOW: Lowest historical temperature
1016 * @IDT_TEMP_HIGH: Highest historical temperature
1017 * @IDT_TEMP_OFFSET: Current temperature offset
1018 */
1019enum idt_temp_val {
1020 IDT_TEMP_CUR,
1021 IDT_TEMP_LOW,
1022 IDT_TEMP_HIGH,
1023 IDT_TEMP_OFFSET
1024};
1025
1026/*
1027 * IDT Memory Windows type. Depending on the device settings, IDT supports
1028 * Direct Address Translation MW registers and Lookup Table registers
1029 * @IDT_MW_DIR: Direct address translation
1030 * @IDT_MW_LUT12: 12-entry lookup table entry
1031 * @IDT_MW_LUT24: 24-entry lookup table entry
1032 *
1033 * NOTE These values are exactly the same as one of the BARSETUP ATRAN field
1034 */
1035enum idt_mw_type {
1036 IDT_MW_DIR = 0x0,
1037 IDT_MW_LUT12 = 0x1,
1038 IDT_MW_LUT24 = 0x2
1039};
1040
1041/*
1042 * IDT PCIe-switch model private data
1043 * @name: Device name
1044 * @port_cnt: Total number of NT endpoint ports
1045 * @ports: Port ids
1046 */
1047struct idt_89hpes_cfg {
1048 char *name;
1049 unsigned char port_cnt;
1050 unsigned char ports[];
1051};
1052
1053/*
1054 * Memory window configuration structure
1055 * @type: Type of the memory window (direct address translation or lookup
1056 * table)
1057 *
1058 * @bar: PCIe BAR the memory window referenced to
1059 * @idx: Index of the memory window within the BAR
1060 *
1061 * @addr_align: Alignment of translated address
1062 * @size_align: Alignment of memory window size
1063 * @size_max: Maximum size of memory window
1064 */
1065struct idt_mw_cfg {
1066 enum idt_mw_type type;
1067
1068 unsigned char bar;
1069 unsigned char idx;
1070
1071 u64 addr_align;
1072 u64 size_align;
1073 u64 size_max;
1074};
1075
1076/*
1077 * Description structure of peer IDT NT-functions:
1078 * @port: NT-function port
1079 * @part: NT-function partition
1080 *
1081 * @mw_cnt: Number of memory windows supported by NT-function
1082 * @mws: Array of memory windows descriptors
1083 */
1084struct idt_ntb_peer {
1085 unsigned char port;
1086 unsigned char part;
1087
1088 unsigned char mw_cnt;
1089 struct idt_mw_cfg *mws;
1090};
1091
1092/*
1093 * Description structure of local IDT NT-function:
1094 * @ntb: Linux NTB-device description structure
1095 * @swcfg: Pointer to the structure of local IDT PCIe-switch
1096 * specific cofnfigurations
1097 *
1098 * @port: Local NT-function port
1099 * @part: Local NT-function partition
1100 *
1101 * @peer_cnt: Number of peers with activated NTB-function
1102 * @peers: Array of peers descripting structures
1103 * @port_idx_map: Map of port number -> peer index
1104 * @part_idx_map: Map of partition number -> peer index
1105 *
1106 * @mtbl_lock: Mapping table access lock
1107 *
1108 * @mw_cnt: Number of memory windows supported by NT-function
1109 * @mws: Array of memory windows descriptors
1110 * @lut_lock: Lookup table access lock
1111 *
1112 * @msg_locks: Message registers mapping table lockers
1113 *
1114 * @cfgspc: Virtual address of the memory mapped configuration
1115 * space of the NT-function
1116 * @db_mask_lock: Doorbell mask register lock
1117 * @msg_mask_lock: Message mask register lock
1118 * @gasa_lock: GASA registers access lock
1119 *
1120 * @hwmon_mtx: Temperature sensor interface update mutex
1121 *
1122 * @dbgfs_info: DebugFS info node
1123 */
1124struct idt_ntb_dev {
1125 struct ntb_dev ntb;
1126 struct idt_89hpes_cfg *swcfg;
1127
1128 unsigned char port;
1129 unsigned char part;
1130
1131 unsigned char peer_cnt;
1132 struct idt_ntb_peer peers[IDT_MAX_NR_PEERS];
1133 char port_idx_map[IDT_MAX_NR_PORTS];
1134 char part_idx_map[IDT_MAX_NR_PARTS];
1135
1136 spinlock_t mtbl_lock;
1137
1138 unsigned char mw_cnt;
1139 struct idt_mw_cfg *mws;
1140 spinlock_t lut_lock;
1141
1142 spinlock_t msg_locks[IDT_MSG_CNT];
1143
1144 void __iomem *cfgspc;
1145 spinlock_t db_mask_lock;
1146 spinlock_t msg_mask_lock;
1147 spinlock_t gasa_lock;
1148
1149 struct mutex hwmon_mtx;
1150
1151 struct dentry *dbgfs_info;
1152};
1153#define to_ndev_ntb(__ntb) container_of(__ntb, struct idt_ntb_dev, ntb)
1154
1155/*
1156 * Descriptor of the IDT PCIe-switch BAR resources
1157 * @setup: BAR setup register
1158 * @limit: BAR limit register
1159 * @ltbase: Lower translated base address
1160 * @utbase: Upper translated base address
1161 */
1162struct idt_ntb_bar {
1163 unsigned int setup;
1164 unsigned int limit;
1165 unsigned int ltbase;
1166 unsigned int utbase;
1167};
1168
1169/*
1170 * Descriptor of the IDT PCIe-switch message resources
1171 * @in: Inbound message register
1172 * @out: Outbound message register
1173 * @src: Source of inbound message register
1174 */
1175struct idt_ntb_msg {
1176 unsigned int in;
1177 unsigned int out;
1178 unsigned int src;
1179};
1180
1181/*
1182 * Descriptor of the IDT PCIe-switch NT-function specific parameters in the
1183 * PCI Configuration Space
1184 * @bars: BARs related registers
1185 * @msgs: Messaging related registers
1186 */
1187struct idt_ntb_regs {
1188 struct idt_ntb_bar bars[IDT_BAR_CNT];
1189 struct idt_ntb_msg msgs[IDT_MSG_CNT];
1190};
1191
1192/*
1193 * Descriptor of the IDT PCIe-switch port specific parameters in the
1194 * Global Configuration Space
1195 * @pcicmdsts: PCI command/status register
1196 * @pcielctlsts: PCIe link control/status
1197 *
1198 * @ctl: Port control register
1199 * @sts: Port status register
1200 *
1201 * @bars: BARs related registers
1202 */
1203struct idt_ntb_port {
1204 unsigned int pcicmdsts;
1205 unsigned int pcielctlsts;
1206 unsigned int ntctl;
1207
1208 unsigned int ctl;
1209 unsigned int sts;
1210
1211 struct idt_ntb_bar bars[IDT_BAR_CNT];
1212};
1213
1214/*
1215 * Descriptor of the IDT PCIe-switch partition specific parameters.
1216 * @ctl: Partition control register in the Global Address Space
1217 * @sts: Partition status register in the Global Address Space
1218 * @msgctl: Messages control registers
1219 */
1220struct idt_ntb_part {
1221 unsigned int ctl;
1222 unsigned int sts;
1223 unsigned int msgctl[IDT_MSG_CNT];
1224};
1225
1226#endif /* NTB_HW_IDT_H */