cregit-Linux how code gets into the kernel

Release 4.14 drivers/ntb/hw/idt/ntb_hw_idt.h

/*
 *   This file is provided under a GPLv2 license.  When using or
 *   redistributing this file, you may do so under that license.
 *
 *   GPL LICENSE SUMMARY
 *
 *   Copyright (C) 2016 T-Platforms All Rights Reserved.
 *
 *   This program is free software; you can redistribute it and/or modify it
 *   under the terms and conditions of the GNU General Public License,
 *   version 2, as published by the Free Software Foundation.
 *
 *   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, one can be found http://www.gnu.org/licenses/.
 *
 *   The full GNU General Public License is included in this distribution in
 *   the file called "COPYING".
 *
 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * IDT PCIe-switch NTB Linux driver
 *
 * Contact Information:
 * Serge Semin <fancer.lancer@gmail.com>, <Sergey.Semin@t-platforms.ru>
 */

#ifndef NTB_HW_IDT_H

#define NTB_HW_IDT_H

#include <linux/types.h>
#include <linux/pci.h>
#include <linux/pci_ids.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/ntb.h>


/*
 * Macro is used to create the struct pci_device_id that matches
 * the supported IDT PCIe-switches
 * @devname: Capitalized name of the particular device
 * @data: Variable passed to the driver of the particular device
 */

#define IDT_PCI_DEVICE_IDS(devname, data) \
	.vendor = PCI_VENDOR_ID_IDT, .device = PCI_DEVICE_ID_IDT_##devname, \
        .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, \
        .class = (PCI_CLASS_BRIDGE_OTHER << 8), .class_mask = (0xFFFF00), \
        .driver_data = (kernel_ulong_t)&data

/*
 * IDT PCIe-switches device IDs
 */

#define PCI_DEVICE_ID_IDT_89HPES24NT6AG2  0x8091

#define PCI_DEVICE_ID_IDT_89HPES32NT8AG2  0x808F

#define PCI_DEVICE_ID_IDT_89HPES32NT8BG2  0x8088

#define PCI_DEVICE_ID_IDT_89HPES12NT12G2  0x8092

#define PCI_DEVICE_ID_IDT_89HPES16NT16G2  0x8090

#define PCI_DEVICE_ID_IDT_89HPES24NT24G2  0x808E

#define PCI_DEVICE_ID_IDT_89HPES32NT24AG2 0x808C

#define PCI_DEVICE_ID_IDT_89HPES32NT24BG2 0x808A

/*
 * NT-function Configuration Space registers
 * NOTE 1) The IDT PCIe-switch internal data is little-endian
 *      so it must be taken into account in the driver
 *      internals.
 *      2) Additionally the registers should be accessed either
 *      with byte-enables corresponding to their native size or
 *      the size of one DWORD
 *
 * So to simplify the driver code, there is only DWORD-sized read/write
 * operations utilized.
 */
/* PCI Express Configuration Space */
/* PCI Express command/status register  (DWORD) */

#define IDT_NT_PCICMDSTS		0x00004U
/* PCI Express Device Capabilities      (DWORD) */

#define IDT_NT_PCIEDCAP			0x00044U
/* PCI Express Device Control/Status    (WORD+WORD) */

#define IDT_NT_PCIEDCTLSTS		0x00048U
/* PCI Express Link Capabilities        (DWORD) */

#define IDT_NT_PCIELCAP			0x0004CU
/* PCI Express Link Control/Status      (WORD+WORD) */

#define IDT_NT_PCIELCTLSTS		0x00050U
/* PCI Express Device Capabilities 2    (DWORD) */

#define IDT_NT_PCIEDCAP2		0x00064U
/* PCI Express Device Control 2         (WORD+WORD) */

#define IDT_NT_PCIEDCTL2		0x00068U
/* PCI Power Management Control and Status (DWORD) */

#define IDT_NT_PMCSR			0x000C4U
/*==========================================*/
/* IDT Proprietary NT-port-specific registers */
/* NT-function main control registers */
/* NT Endpoint Control                  (DWORD) */

#define IDT_NT_NTCTL			0x00400U
/* NT Endpoint Interrupt Status/Mask    (DWORD) */

#define IDT_NT_NTINTSTS			0x00404U

#define IDT_NT_NTINTMSK			0x00408U
/* NT Endpoint Signal Data              (DWORD) */

#define IDT_NT_NTSDATA			0x0040CU
/* NT Endpoint Global Signal            (DWORD) */

#define IDT_NT_NTGSIGNAL		0x00410U
/* Internal Error Reporting Mask 0/1    (DWORD) */

#define IDT_NT_NTIERRORMSK0		0x00414U

#define IDT_NT_NTIERRORMSK1		0x00418U
/* Doorbel registers */
/* NT Outbound Doorbell Set             (DWORD) */

#define IDT_NT_OUTDBELLSET		0x00420U
/* NT Inbound Doorbell Status/Mask      (DWORD) */

#define IDT_NT_INDBELLSTS		0x00428U

#define IDT_NT_INDBELLMSK		0x0042CU
/* Message registers */
/* Outbound Message N                   (DWORD) */

#define IDT_NT_OUTMSG0			0x00430U

#define IDT_NT_OUTMSG1			0x00434U

#define IDT_NT_OUTMSG2			0x00438U

#define IDT_NT_OUTMSG3			0x0043CU
/* Inbound Message N                    (DWORD) */

#define IDT_NT_INMSG0			0x00440U

#define IDT_NT_INMSG1			0x00444U

#define IDT_NT_INMSG2			0x00448U

#define IDT_NT_INMSG3			0x0044CU
/* Inbound Message Source N             (DWORD) */

#define IDT_NT_INMSGSRC0		0x00450U

#define IDT_NT_INMSGSRC1		0x00454U

#define IDT_NT_INMSGSRC2		0x00458U

#define IDT_NT_INMSGSRC3		0x0045CU
/* Message Status                       (DWORD) */

#define IDT_NT_MSGSTS			0x00460U
/* Message Status Mask                  (DWORD) */

#define IDT_NT_MSGSTSMSK		0x00464U
/* BAR-setup registers */
/* BAR N Setup/Limit Address/Lower and Upper Translated Base Address (DWORD) */

#define IDT_NT_BARSETUP0		0x00470U

#define IDT_NT_BARLIMIT0		0x00474U

#define IDT_NT_BARLTBASE0		0x00478U

#define IDT_NT_BARUTBASE0		0x0047CU

#define IDT_NT_BARSETUP1		0x00480U

#define IDT_NT_BARLIMIT1		0x00484U

#define IDT_NT_BARLTBASE1		0x00488U

#define IDT_NT_BARUTBASE1		0x0048CU

#define IDT_NT_BARSETUP2		0x00490U

#define IDT_NT_BARLIMIT2		0x00494U

#define IDT_NT_BARLTBASE2		0x00498U

#define IDT_NT_BARUTBASE2		0x0049CU

#define IDT_NT_BARSETUP3		0x004A0U

#define IDT_NT_BARLIMIT3		0x004A4U

#define IDT_NT_BARLTBASE3		0x004A8U

#define IDT_NT_BARUTBASE3		0x004ACU

#define IDT_NT_BARSETUP4		0x004B0U

#define IDT_NT_BARLIMIT4		0x004B4U

#define IDT_NT_BARLTBASE4		0x004B8U

#define IDT_NT_BARUTBASE4		0x004BCU

#define IDT_NT_BARSETUP5		0x004C0U

#define IDT_NT_BARLIMIT5		0x004C4U

#define IDT_NT_BARLTBASE5		0x004C8U

#define IDT_NT_BARUTBASE5		0x004CCU
/* NT mapping table registers */
/* NT Mapping Table Address/Status/Data (DWORD) */

#define IDT_NT_NTMTBLADDR		0x004D0U

#define IDT_NT_NTMTBLSTS		0x004D4U

#define IDT_NT_NTMTBLDATA		0x004D8U
/* Requester ID (Bus:Device:Function) Capture   (DWORD) */

#define IDT_NT_REQIDCAP			0x004DCU
/* Memory Windows Lookup table registers */
/* Lookup Table Offset/Lower, Middle and Upper data     (DWORD) */

#define IDT_NT_LUTOFFSET		0x004E0U

#define IDT_NT_LUTLDATA			0x004E4U

#define IDT_NT_LUTMDATA			0x004E8U

#define IDT_NT_LUTUDATA			0x004ECU
/* NT Endpoint Uncorrectable/Correctable Errors Emulation registers (DWORD) */

#define IDT_NT_NTUEEM			0x004F0U

#define IDT_NT_NTCEEM			0x004F4U
/* Global Address Space Access/Data registers   (DWARD) */

#define IDT_NT_GASAADDR			0x00FF8U

#define IDT_NT_GASADATA			0x00FFCU

/*
 * IDT PCIe-switch Global Configuration and Status registers
 */
/* Port N Configuration register in global space */
/* PCI Express command/status and link control/status registers (WORD+WORD) */

#define IDT_SW_NTP0_PCIECMDSTS		0x01004U

#define IDT_SW_NTP0_PCIELCTLSTS		0x01050U
/* NT-function control register         (DWORD) */

#define IDT_SW_NTP0_NTCTL		0x01400U
/* BAR setup/limit/base address registers (DWORD) */

#define IDT_SW_NTP0_BARSETUP0		0x01470U

#define IDT_SW_NTP0_BARLIMIT0		0x01474U

#define IDT_SW_NTP0_BARLTBASE0		0x01478U

#define IDT_SW_NTP0_BARUTBASE0		0x0147CU

#define IDT_SW_NTP0_BARSETUP1		0x01480U

#define IDT_SW_NTP0_BARLIMIT1		0x01484U

#define IDT_SW_NTP0_BARLTBASE1		0x01488U

#define IDT_SW_NTP0_BARUTBASE1		0x0148CU

#define IDT_SW_NTP0_BARSETUP2		0x01490U

#define IDT_SW_NTP0_BARLIMIT2		0x01494U

#define IDT_SW_NTP0_BARLTBASE2		0x01498U

#define IDT_SW_NTP0_BARUTBASE2		0x0149CU

#define IDT_SW_NTP0_BARSETUP3		0x014A0U

#define IDT_SW_NTP0_BARLIMIT3		0x014A4U

#define IDT_SW_NTP0_BARLTBASE3		0x014A8U

#define IDT_SW_NTP0_BARUTBASE3		0x014ACU

#define IDT_SW_NTP0_BARSETUP4		0x014B0U

#define IDT_SW_NTP0_BARLIMIT4		0x014B4U

#define IDT_SW_NTP0_BARLTBASE4		0x014B8U

#define IDT_SW_NTP0_BARUTBASE4		0x014BCU

#define IDT_SW_NTP0_BARSETUP5		0x014C0U

#define IDT_SW_NTP0_BARLIMIT5		0x014C4U

#define IDT_SW_NTP0_BARLTBASE5		0x014C8U

#define IDT_SW_NTP0_BARUTBASE5		0x014CCU
/* PCI Express command/status and link control/status registers (WORD+WORD) */

#define IDT_SW_NTP2_PCIECMDSTS		0x05004U

#define IDT_SW_NTP2_PCIELCTLSTS		0x05050U
/* NT-function control register         (DWORD) */

#define IDT_SW_NTP2_NTCTL		0x05400U
/* BAR setup/limit/base address registers (DWORD) */

#define IDT_SW_NTP2_BARSETUP0		0x05470U

#define IDT_SW_NTP2_BARLIMIT0		0x05474U

#define IDT_SW_NTP2_BARLTBASE0		0x05478U

#define IDT_SW_NTP2_BARUTBASE0		0x0547CU

#define IDT_SW_NTP2_BARSETUP1		0x05480U

#define IDT_SW_NTP2_BARLIMIT1		0x05484U

#define IDT_SW_NTP2_BARLTBASE1		0x05488U

#define IDT_SW_NTP2_BARUTBASE1		0x0548CU

#define IDT_SW_NTP2_BARSETUP2		0x05490U

#define IDT_SW_NTP2_BARLIMIT2		0x05494U

#define IDT_SW_NTP2_BARLTBASE2		0x05498U

#define IDT_SW_NTP2_BARUTBASE2		0x0549CU

#define IDT_SW_NTP2_BARSETUP3		0x054A0U

#define IDT_SW_NTP2_BARLIMIT3		0x054A4U

#define IDT_SW_NTP2_BARLTBASE3		0x054A8U

#define IDT_SW_NTP2_BARUTBASE3		0x054ACU

#define IDT_SW_NTP2_BARSETUP4		0x054B0U

#define IDT_SW_NTP2_BARLIMIT4		0x054B4U

#define IDT_SW_NTP2_BARLTBASE4		0x054B8U

#define IDT_SW_NTP2_BARUTBASE4		0x054BCU

#define IDT_SW_NTP2_BARSETUP5		0x054C0U

#define IDT_SW_NTP2_BARLIMIT5		0x054C4U

#define IDT_SW_NTP2_BARLTBASE5		0x054C8U

#define IDT_SW_NTP2_BARUTBASE5		0x054CCU
/* PCI Express command/status and link control/status registers (WORD+WORD) */

#define IDT_SW_NTP4_PCIECMDSTS		0x09004U

#define IDT_SW_NTP4_PCIELCTLSTS		0x09050U
/* NT-function control register         (DWORD) */

#define IDT_SW_NTP4_NTCTL		0x09400U
/* BAR setup/limit/base address registers (DWORD) */

#define IDT_SW_NTP4_BARSETUP0		0x09470U

#define IDT_SW_NTP4_BARLIMIT0		0x09474U

#define IDT_SW_NTP4_BARLTBASE0		0x09478U

#define IDT_SW_NTP4_BARUTBASE0		0x0947CU

#define IDT_SW_NTP4_BARSETUP1		0x09480U

#define IDT_SW_NTP4_BARLIMIT1		0x09484U

#define IDT_SW_NTP4_BARLTBASE1		0x09488U

#define IDT_SW_NTP4_BARUTBASE1		0x0948CU

#define IDT_SW_NTP4_BARSETUP2		0x09490U

#define IDT_SW_NTP4_BARLIMIT2		0x09494U

#define IDT_SW_NTP4_BARLTBASE2		0x09498U

#define IDT_SW_NTP4_BARUTBASE2		0x0949CU

#define IDT_SW_NTP4_BARSETUP3		0x094A0U

#define IDT_SW_NTP4_BARLIMIT3		0x094A4U

#define IDT_SW_NTP4_BARLTBASE3		0x094A8U

#define IDT_SW_NTP4_BARUTBASE3		0x094ACU

#define IDT_SW_NTP4_BARSETUP4		0x094B0U

#define IDT_SW_NTP4_BARLIMIT4		0x094B4U

#define IDT_SW_NTP4_BARLTBASE4		0x094B8U

#define IDT_SW_NTP4_BARUTBASE4		0x094BCU

#define IDT_SW_NTP4_BARSETUP5		0x094C0U

#define IDT_SW_NTP4_BARLIMIT5		0x094C4U

#define IDT_SW_NTP4_BARLTBASE5		0x094C8U

#define IDT_SW_NTP4_BARUTBASE5		0x094CCU
/* PCI Express command/status and link control/status registers (WORD+WORD) */

#define IDT_SW_NTP6_PCIECMDSTS		0x0D004U

#define IDT_SW_NTP6_PCIELCTLSTS		0x0D050U
/* NT-function control register         (DWORD) */

#define IDT_SW_NTP6_NTCTL		0x0D400U
/* BAR setup/limit/base address registers (DWORD) */

#define IDT_SW_NTP6_BARSETUP0		0x0D470U

#define IDT_SW_NTP6_BARLIMIT0		0x0D474U

#define IDT_SW_NTP6_BARLTBASE0		0x0D478U

#define IDT_SW_NTP6_BARUTBASE0		0x0D47CU

#define IDT_SW_NTP6_BARSETUP1		0x0D480U

#define IDT_SW_NTP6_BARLIMIT1		0x0D484U

#define IDT_SW_NTP6_BARLTBASE1		0x0D488U

#define IDT_SW_NTP6_BARUTBASE1		0x0D48CU

#define IDT_SW_NTP6_BARSETUP2		0x0D490U

#define IDT_SW_NTP6_BARLIMIT2		0x0D494U

#define IDT_SW_NTP6_BARLTBASE2		0x0D498U

#define IDT_SW_NTP6_BARUTBASE2		0x0D49CU

#define IDT_SW_NTP6_BARSETUP3		0x0D4A0U

#define IDT_SW_NTP6_BARLIMIT3		0x0D4A4U

#define IDT_SW_NTP6_BARLTBASE3		0x0D4A8U

#define IDT_SW_NTP6_BARUTBASE3		0x0D4ACU

#define IDT_SW_NTP6_BARSETUP4		0x0D4B0U

#define IDT_SW_NTP6_BARLIMIT4		0x0D4B4U

#define IDT_SW_NTP6_BARLTBASE4		0x0D4B8U

#define IDT_SW_NTP6_BARUTBASE4		0x0D4BCU

#define IDT_SW_NTP6_BARSETUP5		0x0D4C0U

#define IDT_SW_NTP6_BARLIMIT5		0x0D4C4U

#define IDT_SW_NTP6_BARLTBASE5		0x0D4C8U

#define IDT_SW_NTP6_BARUTBASE5		0x0D4CCU
/* PCI Express command/status and link control/status registers (WORD+WORD) */

#define IDT_SW_NTP8_PCIECMDSTS		0x11004U

#define IDT_SW_NTP8_PCIELCTLSTS		0x11050U
/* NT-function control register         (DWORD) */

#define IDT_SW_NTP8_NTCTL		0x11400U
/* BAR setup/limit/base address registers (DWORD) */

#define IDT_SW_NTP8_BARSETUP0		0x11470U

#define IDT_SW_NTP8_BARLIMIT0		0x11474U

#define IDT_SW_NTP8_BARLTBASE0		0x11478U

#define IDT_SW_NTP8_BARUTBASE0		0x1147CU

#define IDT_SW_NTP8_BARSETUP1		0x11480U

#define IDT_SW_NTP8_BARLIMIT1		0x11484U

#define IDT_SW_NTP8_BARLTBASE1		0x11488U

#define IDT_SW_NTP8_BARUTBASE1		0x1148CU

#define IDT_SW_NTP8_BARSETUP2		0x11490U

#define IDT_SW_NTP8_BARLIMIT2		0x11494U

#define IDT_SW_NTP8_BARLTBASE2		0x11498U

#define IDT_SW_NTP8_BARUTBASE2		0x1149CU

#define IDT_SW_NTP8_BARSETUP3		0x114A0U

#define IDT_SW_NTP8_BARLIMIT3		0x114A4U

#define IDT_SW_NTP8_BARLTBASE3		0x114A8U

#define IDT_SW_NTP8_BARUTBASE3		0x114ACU

#define IDT_SW_NTP8_BARSETUP4		0x114B0U

#define IDT_SW_NTP8_BARLIMIT4		0x114B4U

#define IDT_SW_NTP8_BARLTBASE4		0x114B8U

#define IDT_SW_NTP8_BARUTBASE4		0x114BCU

#define IDT_SW_NTP8_BARSETUP5		0x114C0U

#define IDT_SW_NTP8_BARLIMIT5		0x114C4U

#define IDT_SW_NTP8_BARLTBASE5		0x114C8U

#define IDT_SW_NTP8_BARUTBASE5		0x114CCU
/* PCI Express command/status and link control/status registers (WORD+WORD) */

#define IDT_SW_NTP12_PCIECMDSTS		0x19004U

#define IDT_SW_NTP12_PCIELCTLSTS	0x19050U
/* NT-function control register         (DWORD) */

#define IDT_SW_NTP12_NTCTL		0x19400U
/* BAR setup/limit/base address registers (DWORD) */

#define IDT_SW_NTP12_BARSETUP0		0x19470U

#define IDT_SW_NTP12_BARLIMIT0		0x19474U

#define IDT_SW_NTP12_BARLTBASE0		0x19478U

#define IDT_SW_NTP12_BARUTBASE0		0x1947CU

#define IDT_SW_NTP12_BARSETUP1		0x19480U

#define IDT_SW_NTP12_BARLIMIT1		0x19484U

#define IDT_SW_NTP12_BARLTBASE1		0x19488U

#define IDT_SW_NTP12_BARUTBASE1		0x1948CU

#define IDT_SW_NTP12_BARSETUP2		0x19490U

#define IDT_SW_NTP12_BARLIMIT2		0x19494U

#define IDT_SW_NTP12_BARLTBASE2		0x19498U

#define IDT_SW_NTP12_BARUTBASE2		0x1949CU

#define IDT_SW_NTP12_BARSETUP3		0x194A0U

#define IDT_SW_NTP12_BARLIMIT3		0x194A4U

#define IDT_SW_NTP12_BARLTBASE3		0x194A8U

#define IDT_SW_NTP12_BARUTBASE3		0x194ACU

#define IDT_SW_NTP12_BARSETUP4		0x194B0U

#define IDT_SW_NTP12_BARLIMIT4		0x194B4U

#define IDT_SW_NTP12_BARLTBASE4		0x194B8U

#define IDT_SW_NTP12_BARUTBASE4		0x194BCU

#define IDT_SW_NTP12_BARSETUP5		0x194C0U

#define IDT_SW_NTP12_BARLIMIT5		0x194C4U

#define IDT_SW_NTP12_BARLTBASE5		0x194C8U

#define IDT_SW_NTP12_BARUTBASE5		0x194CCU
/* PCI Express command/status and link control/status registers (WORD+WORD) */

#define IDT_SW_NTP16_PCIECMDSTS		0x21004U

#define IDT_SW_NTP16_PCIELCTLSTS	0x21050U
/* NT-function control register         (DWORD) */

#define IDT_SW_NTP16_NTCTL		0x21400U
/* BAR setup/limit/base address registers (DWORD) */

#define IDT_SW_NTP16_BARSETUP0		0x21470U

#define IDT_SW_NTP16_BARLIMIT0		0x21474U

#define IDT_SW_NTP16_BARLTBASE0		0x21478U

#define IDT_SW_NTP16_BARUTBASE0		0x2147CU

#define IDT_SW_NTP16_BARSETUP1		0x21480U

#define IDT_SW_NTP16_BARLIMIT1		0x21484U

#define IDT_SW_NTP16_BARLTBASE1		0x21488U

#define IDT_SW_NTP16_BARUTBASE1		0x2148CU

#define IDT_SW_NTP16_BARSETUP2		0x21490U

#define IDT_SW_NTP16_BARLIMIT2		0x21494U

#define IDT_SW_NTP16_BARLTBASE2		0x21498U

#define IDT_SW_NTP16_BARUTBASE2		0x2149CU

#define IDT_SW_NTP16_BARSETUP3		0x214A0U

#define IDT_SW_NTP16_BARLIMIT3		0x214A4U

#define IDT_SW_NTP16_BARLTBASE3		0x214A8U

#define IDT_SW_NTP16_BARUTBASE3		0x214ACU

#define IDT_SW_NTP16_BARSETUP4		0x214B0U

#define IDT_SW_NTP16_BARLIMIT4		0x214B4U

#define IDT_SW_NTP16_BARLTBASE4		0x214B8U

#define IDT_SW_NTP16_BARUTBASE4		0x214BCU

#define IDT_SW_NTP16_BARSETUP5		0x214C0U

#define IDT_SW_NTP16_BARLIMIT5		0x214C4U

#define IDT_SW_NTP16_BARLTBASE5		0x214C8U

#define IDT_SW_NTP16_BARUTBASE5		0x214CCU
/* PCI Express command/status and link control/status registers (WORD+WORD) */

#define IDT_SW_NTP20_PCIECMDSTS		0x29004U

#define IDT_SW_NTP20_PCIELCTLSTS	0x29050U
/* NT-function control register         (DWORD) */

#define IDT_SW_NTP20_NTCTL		0x29400U
/* BAR setup/limit/base address registers (DWORD) */

#define IDT_SW_NTP20_BARSETUP0		0x29470U

#define IDT_SW_NTP20_BARLIMIT0		0x29474U

#define IDT_SW_NTP20_BARLTBASE0		0x29478U

#define IDT_SW_NTP20_BARUTBASE0		0x2947CU

#define IDT_SW_NTP20_BARSETUP1		0x29480U

#define IDT_SW_NTP20_BARLIMIT1		0x29484U

#define IDT_SW_NTP20_BARLTBASE1		0x29488U

#define IDT_SW_NTP20_BARUTBASE1		0x2948CU

#define IDT_SW_NTP20_BARSETUP2		0x29490U

#define IDT_SW_NTP20_BARLIMIT2		0x29494U

#define IDT_SW_NTP20_BARLTBASE2		0x29498U

#define IDT_SW_NTP20_BARUTBASE2		0x2949CU

#define IDT_SW_NTP20_BARSETUP3		0x294A0U

#define IDT_SW_NTP20_BARLIMIT3		0x294A4U

#define IDT_SW_NTP20_BARLTBASE3		0x294A8U

#define IDT_SW_NTP20_BARUTBASE3		0x294ACU

#define IDT_SW_NTP20_BARSETUP4		0x294B0U

#define IDT_SW_NTP20_BARLIMIT4		0x294B4U

#define IDT_SW_NTP20_BARLTBASE4		0x294B8U

#define IDT_SW_NTP20_BARUTBASE4		0x294BCU

#define IDT_SW_NTP20_BARSETUP5		0x294C0U

#define IDT_SW_NTP20_BARLIMIT5		0x294C4U

#define IDT_SW_NTP20_BARLTBASE5		0x294C8U

#define IDT_SW_NTP20_BARUTBASE5		0x294CCU
/* IDT PCIe-switch control register     (DWORD) */

#define IDT_SW_CTL			0x3E000U
/* Boot Configuration Vector Status     (DWORD) */

#define IDT_SW_BCVSTS			0x3E004U
/* Port Clocking Mode                   (DWORD) */

#define IDT_SW_PCLKMODE			0x3E008U
/* Reset Drain Delay                    (DWORD) */

#define IDT_SW_RDRAINDELAY		0x3E080U
/* Port Operating Mode Change Drain Delay (DWORD) */

#define IDT_SW_POMCDELAY		0x3E084U
/* Side Effect Delay                    (DWORD) */

#define IDT_SW_SEDELAY			0x3E088U
/* Upstream Secondary Bus Reset Delay   (DWORD) */

#define IDT_SW_SSBRDELAY		0x3E08CU
/* Switch partition N Control/Status/Failover registers */

#define IDT_SW_SWPART0CTL		0x3E100U

#define IDT_SW_SWPART0STS		0x3E104U

#define IDT_SW_SWPART0FCTL		0x3E108U

#define IDT_SW_SWPART1CTL		0x3E120U

#define IDT_SW_SWPART1STS		0x3E124U

#define IDT_SW_SWPART1FCTL		0x3E128U

#define IDT_SW_SWPART2CTL		0x3E140U

#define IDT_SW_SWPART2STS		0x3E144U

#define IDT_SW_SWPART2FCTL		0x3E148U

#define IDT_SW_SWPART3CTL		0x3E160U

#define IDT_SW_SWPART3STS		0x3E164U

#define IDT_SW_SWPART3FCTL		0x3E168U

#define IDT_SW_SWPART4CTL		0x3E180U

#define IDT_SW_SWPART4STS		0x3E184U

#define IDT_SW_SWPART4FCTL		0x3E188U

#define IDT_SW_SWPART5CTL		0x3E1A0U

#define IDT_SW_SWPART5STS		0x3E1A4U

#define IDT_SW_SWPART5FCTL		0x3E1A8U

#define IDT_SW_SWPART6CTL		0x3E1C0U

#define IDT_SW_SWPART6STS		0x3E1C4U

#define IDT_SW_SWPART6FCTL		0x3E1C8U

#define IDT_SW_SWPART7CTL		0x3E1E0U

#define IDT_SW_SWPART7STS		0x3E1E4U

#define IDT_SW_SWPART7FCTL		0x3E1E8U
/* Switch port N control and status registers */

#define IDT_SW_SWPORT0CTL		0x3E200U

#define IDT_SW_SWPORT0STS		0x3E204U

#define IDT_SW_SWPORT0FCTL		0x3E208U

#define IDT_SW_SWPORT2CTL		0x3E240U

#define IDT_SW_SWPORT2STS		0x3E244U

#define IDT_SW_SWPORT2FCTL		0x3E248U

#define IDT_SW_SWPORT4CTL		0x3E280U

#define IDT_SW_SWPORT4STS		0x3E284U

#define IDT_SW_SWPORT4FCTL		0x3E288U

#define IDT_SW_SWPORT6CTL		0x3E2C0U

#define IDT_SW_SWPORT6STS		0x3E2C4U

#define IDT_SW_SWPORT6FCTL		0x3E2C8U

#define IDT_SW_SWPORT8CTL		0x3E300U

#define IDT_SW_SWPORT8STS		0x3E304U

#define IDT_SW_SWPORT8FCTL		0x3E308U

#define IDT_SW_SWPORT12CTL		0x3E380U

#define IDT_SW_SWPORT12STS		0x3E384U

#define IDT_SW_SWPORT12FCTL		0x3E388U

#define IDT_SW_SWPORT16CTL		0x3E400U

#define IDT_SW_SWPORT16STS		0x3E404U

#define IDT_SW_SWPORT16FCTL		0x3E408U

#define IDT_SW_SWPORT20CTL		0x3E480U

#define IDT_SW_SWPORT20STS		0x3E484U

#define IDT_SW_SWPORT20FCTL		0x3E488U
/* Switch Event registers */
/* Switch Event Status/Mask/Partition mask (DWORD) */

#define IDT_SW_SESTS			0x3EC00U

#define IDT_SW_SEMSK			0x3EC04U

#define IDT_SW_SEPMSK			0x3EC08U
/* Switch Event Link Up/Down Status/Mask (DWORD) */

#define IDT_SW_SELINKUPSTS		0x3EC0CU

#define IDT_SW_SELINKUPMSK		0x3EC10U

#define IDT_SW_SELINKDNSTS		0x3EC14U

#define IDT_SW_SELINKDNMSK		0x3EC18U
/* Switch Event Fundamental Reset Status/Mask (DWORD) */

#define IDT_SW_SEFRSTSTS		0x3EC1CU

#define IDT_SW_SEFRSTMSK		0x3EC20U
/* Switch Event Hot Reset Status/Mask   (DWORD) */

#define IDT_SW_SEHRSTSTS		0x3EC24U

#define IDT_SW_SEHRSTMSK		0x3EC28U
/* Switch Event Failover Mask           (DWORD) */

#define IDT_SW_SEFOVRMSK		0x3EC2CU
/* Switch Event Global Signal Status/Mask (DWORD) */

#define IDT_SW_SEGSIGSTS		0x3EC30U

#define IDT_SW_SEGSIGMSK		0x3EC34U
/* NT Global Doorbell Status            (DWORD) */

#define IDT_SW_GDBELLSTS		0x3EC3CU
/* Switch partition N message M control (msgs routing table) (DWORD) */

#define IDT_SW_SWP0MSGCTL0		0x3EE00U

#define IDT_SW_SWP1MSGCTL0		0x3EE04U

#define IDT_SW_SWP2MSGCTL0		0x3EE08U

#define IDT_SW_SWP3MSGCTL0		0x3EE0CU

#define IDT_SW_SWP4MSGCTL0		0x3EE10U

#define IDT_SW_SWP5MSGCTL0		0x3EE14U

#define IDT_SW_SWP6MSGCTL0		0x3EE18U

#define IDT_SW_SWP7MSGCTL0		0x3EE1CU

#define IDT_SW_SWP0MSGCTL1		0x3EE20U

#define IDT_SW_SWP1MSGCTL1		0x3EE24U

#define IDT_SW_SWP2MSGCTL1		0x3EE28U

#define IDT_SW_SWP3MSGCTL1		0x3EE2CU

#define IDT_SW_SWP4MSGCTL1		0x3EE30U

#define IDT_SW_SWP5MSGCTL1		0x3EE34U

#define IDT_SW_SWP6MSGCTL1		0x3EE38U

#define IDT_SW_SWP7MSGCTL1		0x3EE3CU

#define IDT_SW_SWP0MSGCTL2		0x3EE40U

#define IDT_SW_SWP1MSGCTL2		0x3EE44U

#define IDT_SW_SWP2MSGCTL2		0x3EE48U

#define IDT_SW_SWP3MSGCTL2		0x3EE4CU

#define IDT_SW_SWP4MSGCTL2		0x3EE50U

#define IDT_SW_SWP5MSGCTL2		0x3EE54U

#define IDT_SW_SWP6MSGCTL2		0x3EE58U

#define IDT_SW_SWP7MSGCTL2		0x3EE5CU

#define IDT_SW_SWP0MSGCTL3		0x3EE60U

#define IDT_SW_SWP1MSGCTL3		0x3EE64U

#define IDT_SW_SWP2MSGCTL3		0x3EE68U

#define IDT_SW_SWP3MSGCTL3		0x3EE6CU

#define IDT_SW_SWP4MSGCTL3		0x3EE70U

#define IDT_SW_SWP5MSGCTL3		0x3EE74U

#define IDT_SW_SWP6MSGCTL3		0x3EE78U

#define IDT_SW_SWP7MSGCTL3		0x3EE7CU
/* SMBus Status and Control registers   (DWORD) */

#define IDT_SW_SMBUSSTS			0x3F188U

#define IDT_SW_SMBUSCTL			0x3F18CU
/* Serial EEPROM Interface              (DWORD) */

#define IDT_SW_EEPROMINTF		0x3F190U
/* MBus I/O Expander Address N          (DWORD) */

#define IDT_SW_IOEXPADDR0		0x3F198U

#define IDT_SW_IOEXPADDR1		0x3F19CU

#define IDT_SW_IOEXPADDR2		0x3F1A0U

#define IDT_SW_IOEXPADDR3		0x3F1A4U

#define IDT_SW_IOEXPADDR4		0x3F1A8U

#define IDT_SW_IOEXPADDR5		0x3F1ACU
/* General Purpose Events Control and Status registers (DWORD) */

#define IDT_SW_GPECTL			0x3F1B0U

#define IDT_SW_GPESTS			0x3F1B4U
/* Temperature sensor Control/Status/Alarm/Adjustment/Slope registers */

#define IDT_SW_TMPCTL			0x3F1D4U

#define IDT_SW_TMPSTS			0x3F1D8U

#define IDT_SW_TMPALARM			0x3F1DCU

#define IDT_SW_TMPADJ			0x3F1E0U

#define IDT_SW_TSSLOPE			0x3F1E4U
/* SMBus Configuration Block header log (DWORD) */

#define IDT_SW_SMBUSCBHL		0x3F1E8U

/*
 * Common registers related constants
 * @IDT_REG_ALIGN:      Registers alignment used in the driver
 * @IDT_REG_PCI_MAX:    Maximum PCI configuration space register value
 * @IDT_REG_SW_MAX:     Maximum global register value
 */

#define IDT_REG_ALIGN			4

#define IDT_REG_PCI_MAX			0x00FFFU

#define IDT_REG_SW_MAX			0x3FFFFU

/*
 * PCICMDSTS register fields related constants
 * @IDT_PCICMDSTS_IOAE: I/O access enable
 * @IDT_PCICMDSTS_MAE:  Memory access enable
 * @IDT_PCICMDSTS_BME:  Bus master enable
 */

#define IDT_PCICMDSTS_IOAE		0x00000001U

#define IDT_PCICMDSTS_MAE		0x00000002U

#define IDT_PCICMDSTS_BME		0x00000004U

/*
 * PCIEDCAP register fields related constants
 * @IDT_PCIEDCAP_MPAYLOAD_MASK:  Maximum payload size mask
 * @IDT_PCIEDCAP_MPAYLOAD_FLD:   Maximum payload size field offset
 * @IDT_PCIEDCAP_MPAYLOAD_S128:  Max supported payload size of 128 bytes
 * @IDT_PCIEDCAP_MPAYLOAD_S256:  Max supported payload size of 256 bytes
 * @IDT_PCIEDCAP_MPAYLOAD_S512:  Max supported payload size of 512 bytes
 * @IDT_PCIEDCAP_MPAYLOAD_S1024: Max supported payload size of 1024 bytes
 * @IDT_PCIEDCAP_MPAYLOAD_S2048: Max supported payload size of 2048 bytes
 */

#define IDT_PCIEDCAP_MPAYLOAD_MASK	0x00000007U

#define IDT_PCIEDCAP_MPAYLOAD_FLD	0

#define IDT_PCIEDCAP_MPAYLOAD_S128	0x00000000U

#define IDT_PCIEDCAP_MPAYLOAD_S256	0x00000001U

#define IDT_PCIEDCAP_MPAYLOAD_S512	0x00000002U

#define IDT_PCIEDCAP_MPAYLOAD_S1024	0x00000003U

#define IDT_PCIEDCAP_MPAYLOAD_S2048	0x00000004U

/*
 * PCIEDCTLSTS registers fields related constants
 * @IDT_PCIEDCTL_MPS_MASK:      Maximum payload size mask
 * @IDT_PCIEDCTL_MPS_FLD:       MPS field offset
 * @IDT_PCIEDCTL_MPS_S128:      Max payload size of 128 bytes
 * @IDT_PCIEDCTL_MPS_S256:      Max payload size of 256 bytes
 * @IDT_PCIEDCTL_MPS_S512:      Max payload size of 512 bytes
 * @IDT_PCIEDCTL_MPS_S1024:     Max payload size of 1024 bytes
 * @IDT_PCIEDCTL_MPS_S2048:     Max payload size of 2048 bytes
 * @IDT_PCIEDCTL_MPS_S4096:     Max payload size of 4096 bytes
 */

#define IDT_PCIEDCTLSTS_MPS_MASK	0x000000E0U

#define IDT_PCIEDCTLSTS_MPS_FLD		5

#define IDT_PCIEDCTLSTS_MPS_S128	0x00000000U

#define IDT_PCIEDCTLSTS_MPS_S256	0x00000020U

#define IDT_PCIEDCTLSTS_MPS_S512	0x00000040U

#define IDT_PCIEDCTLSTS_MPS_S1024	0x00000060U

#define IDT_PCIEDCTLSTS_MPS_S2048	0x00000080U

#define IDT_PCIEDCTLSTS_MPS_S4096	0x000000A0U

/*
 * PCIELCAP register fields related constants
 * @IDT_PCIELCAP_PORTNUM_MASK:  Port number field mask
 * @IDT_PCIELCAP_PORTNUM_FLD:   Port number field offset
 */

#define IDT_PCIELCAP_PORTNUM_MASK	0xFF000000U

#define IDT_PCIELCAP_PORTNUM_FLD	24

/*
 * PCIELCTLSTS registers fields related constants
 * @IDT_PCIELSTS_CLS_MASK:      Current link speed mask
 * @IDT_PCIELSTS_CLS_FLD:       Current link speed field offset
 * @IDT_PCIELSTS_NLW_MASK:      Negotiated link width mask
 * @IDT_PCIELSTS_NLW_FLD:       Negotiated link width field offset
 * @IDT_PCIELSTS_SCLK_COM:      Common slot clock configuration
 */

#define IDT_PCIELCTLSTS_CLS_MASK	0x000F0000U

#define IDT_PCIELCTLSTS_CLS_FLD		16

#define IDT_PCIELCTLSTS_NLW_MASK	0x03F00000U

#define IDT_PCIELCTLSTS_NLW_FLD		20

#define IDT_PCIELCTLSTS_SCLK_COM	0x10000000U

/*
 * NTCTL register fields related constants
 * @IDT_NTCTL_IDPROTDIS:        ID Protection check disable (disable MTBL)
 * @IDT_NTCTL_CPEN:             Completion enable
 * @IDT_NTCTL_RNS:              Request no snoop processing (if MTBL disabled)
 * @IDT_NTCTL_ATP:              Address type processing (if MTBL disabled)
 */

#define IDT_NTCTL_IDPROTDIS		0x00000001U

#define IDT_NTCTL_CPEN			0x00000002U

#define IDT_NTCTL_RNS			0x00000004U

#define IDT_NTCTL_ATP			0x00000008U

/*
 * NTINTSTS register fields related constants
 * @IDT_NTINTSTS_MSG:           Message interrupt bit
 * @IDT_NTINTSTS_DBELL:         Doorbell interrupt bit
 * @IDT_NTINTSTS_SEVENT:        Switch Event interrupt bit
 * @IDT_NTINTSTS_TMPSENSOR:     Temperature sensor interrupt bit
 */

#define IDT_NTINTSTS_MSG		0x00000001U

#define IDT_NTINTSTS_DBELL		0x00000002U

#define IDT_NTINTSTS_SEVENT		0x00000008U

#define IDT_NTINTSTS_TMPSENSOR		0x00000080U

/*
 * NTINTMSK register fields related constants
 * @IDT_NTINTMSK_MSG:           Message interrupt mask bit
 * @IDT_NTINTMSK_DBELL:         Doorbell interrupt mask bit
 * @IDT_NTINTMSK_SEVENT:        Switch Event interrupt mask bit
 * @IDT_NTINTMSK_TMPSENSOR:     Temperature sensor interrupt mask bit
 * @IDT_NTINTMSK_ALL:           All the useful interrupts mask
 */

#define IDT_NTINTMSK_MSG		0x00000001U

#define IDT_NTINTMSK_DBELL		0x00000002U

#define IDT_NTINTMSK_SEVENT		0x00000008U

#define IDT_NTINTMSK_TMPSENSOR		0x00000080U

#define IDT_NTINTMSK_ALL \
	(IDT_NTINTMSK_MSG | IDT_NTINTMSK_DBELL | \
         IDT_NTINTMSK_SEVENT | IDT_NTINTMSK_TMPSENSOR)

/*
 * NTGSIGNAL register fields related constants
 * @IDT_NTGSIGNAL_SET:  Set global signal of the local partition
 */

#define IDT_NTGSIGNAL_SET		0x00000001U

/*
 * BARSETUP register fields related constants
 * @IDT_BARSETUP_TYPE_MASK:     Mask of the TYPE field
 * @IDT_BARSETUP_TYPE_32:       32-bit addressing BAR
 * @IDT_BARSETUP_TYPE_64:       64-bit addressing BAR
 * @IDT_BARSETUP_PREF:          Value of the BAR prefetchable field
 * @IDT_BARSETUP_SIZE_MASK:     Mask of the SIZE field
 * @IDT_BARSETUP_SIZE_FLD:      SIZE field offset
 * @IDT_BARSETUP_SIZE_CFG:      SIZE field value in case of config space MODE
 * @IDT_BARSETUP_MODE_CFG:      Configuration space BAR mode
 * @IDT_BARSETUP_ATRAN_MASK:    ATRAN field mask
 * @IDT_BARSETUP_ATRAN_FLD:     ATRAN field offset
 * @IDT_BARSETUP_ATRAN_DIR:     Direct address translation memory window
 * @IDT_BARSETUP_ATRAN_LUT12:   12-entry lookup table
 * @IDT_BARSETUP_ATRAN_LUT24:   24-entry lookup table
 * @IDT_BARSETUP_TPART_MASK:    TPART field mask
 * @IDT_BARSETUP_TPART_FLD:     TPART field offset
 * @IDT_BARSETUP_EN:            BAR enable bit
 */

#define IDT_BARSETUP_TYPE_MASK		0x00000006U

#define IDT_BARSETUP_TYPE_FLD		0

#define IDT_BARSETUP_TYPE_32		0x00000000U

#define IDT_BARSETUP_TYPE_64		0x00000004U

#define IDT_BARSETUP_PREF		0x00000008U

#define IDT_BARSETUP_SIZE_MASK		0x000003F0U

#define IDT_BARSETUP_SIZE_FLD		4

#define IDT_BARSETUP_SIZE_CFG		0x000000C0U

#define IDT_BARSETUP_MODE_CFG		0x00000400U

#define IDT_BARSETUP_ATRAN_MASK		0x00001800U

#define IDT_BARSETUP_ATRAN_FLD		11

#define IDT_BARSETUP_ATRAN_DIR		0x00000000U

#define IDT_BARSETUP_ATRAN_LUT12	0x00000800U

#define IDT_BARSETUP_ATRAN_LUT24	0x00001000U

#define IDT_BARSETUP_TPART_MASK		0x0000E000U

#define IDT_BARSETUP_TPART_FLD		13

#define IDT_BARSETUP_EN			0x80000000U

/*
 * NTMTBLDATA register fields related constants
 * @IDT_NTMTBLDATA_VALID:       Set the MTBL entry being valid
 * @IDT_NTMTBLDATA_REQID_MASK:  Bus:Device:Function field mask
 * @IDT_NTMTBLDATA_REQID_FLD:   Bus:Device:Function field offset
 * @IDT_NTMTBLDATA_PART_MASK:   Partition field mask
 * @IDT_NTMTBLDATA_PART_FLD:    Partition field offset
 * @IDT_NTMTBLDATA_ATP_TRANS:   Enable AT field translation on request TLPs
 * @IDT_NTMTBLDATA_CNS_INV:     Enable No Snoop attribute inversion of
 *                              Completion TLPs
 * @IDT_NTMTBLDATA_RNS_INV:     Enable No Snoop attribute inversion of
 *                              Request TLPs
 */

#define IDT_NTMTBLDATA_VALID		0x00000001U

#define IDT_NTMTBLDATA_REQID_MASK	0x0001FFFEU

#define IDT_NTMTBLDATA_REQID_FLD	1

#define IDT_NTMTBLDATA_PART_MASK	0x000E0000U

#define IDT_NTMTBLDATA_PART_FLD		17

#define IDT_NTMTBLDATA_ATP_TRANS	0x20000000U

#define IDT_NTMTBLDATA_CNS_INV		0x40000000U

#define IDT_NTMTBLDATA_RNS_INV		0x80000000U

/*
 * REQIDCAP register fields related constants
 * @IDT_REQIDCAP_REQID_MASK:    Request ID field mask
 * @IDT_REQIDCAP_REQID_FLD:     Request ID field offset
 */

#define IDT_REQIDCAP_REQID_MASK		0x0000FFFFU

#define IDT_REQIDCAP_REQID_FLD		0

/*
 * LUTOFFSET register fields related constants
 * @IDT_LUTOFFSET_INDEX_MASK:   Lookup table index field mask
 * @IDT_LUTOFFSET_INDEX_FLD:    Lookup table index field offset
 * @IDT_LUTOFFSET_BAR_MASK:     Lookup table BAR select field mask
 * @IDT_LUTOFFSET_BAR_FLD:      Lookup table BAR select field offset
 */

#define IDT_LUTOFFSET_INDEX_MASK	0x0000001FU

#define IDT_LUTOFFSET_INDEX_FLD		0

#define IDT_LUTOFFSET_BAR_MASK		0x00000700U

#define IDT_LUTOFFSET_BAR_FLD		8

/*
 * LUTUDATA register fields related constants
 * @IDT_LUTUDATA_PART_MASK:     Partition field mask
 * @IDT_LUTUDATA_PART_FLD:      Partition field offset
 * @IDT_LUTUDATA_VALID:         Lookup table entry valid bit
 */

#define IDT_LUTUDATA_PART_MASK		0x0000000FU

#define IDT_LUTUDATA_PART_FLD		0

#define IDT_LUTUDATA_VALID		0x80000000U

/*
 * SWPARTxSTS register fields related constants
 * @IDT_SWPARTxSTS_SCI:         Switch partition state change initiated
 * @IDT_SWPARTxSTS_SCC:         Switch partition state change completed
 * @IDT_SWPARTxSTS_STATE_MASK:  Switch partition state mask
 * @IDT_SWPARTxSTS_STATE_FLD:   Switch partition state field offset
 * @IDT_SWPARTxSTS_STATE_DIS:   Switch partition disabled
 * @IDT_SWPARTxSTS_STATE_ACT:   Switch partition enabled
 * @IDT_SWPARTxSTS_STATE_RES:   Switch partition in reset
 * @IDT_SWPARTxSTS_US:          Switch partition has upstream port
 * @IDT_SWPARTxSTS_USID_MASK:   Switch partition upstream port ID mask
 * @IDT_SWPARTxSTS_USID_FLD:    Switch partition upstream port ID field offset
 * @IDT_SWPARTxSTS_NT:          Upstream port has NT function
 * @IDT_SWPARTxSTS_DMA:         Upstream port has DMA function
 */

#define IDT_SWPARTxSTS_SCI		0x00000001U

#define IDT_SWPARTxSTS_SCC		0x00000002U

#define IDT_SWPARTxSTS_STATE_MASK	0x00000060U

#define IDT_SWPARTxSTS_STATE_FLD	5

#define IDT_SWPARTxSTS_STATE_DIS	0x00000000U

#define IDT_SWPARTxSTS_STATE_ACT	0x00000020U

#define IDT_SWPARTxSTS_STATE_RES	0x00000060U

#define IDT_SWPARTxSTS_US		0x00000100U

#define IDT_SWPARTxSTS_USID_MASK	0x00003E00U

#define IDT_SWPARTxSTS_USID_FLD		9

#define IDT_SWPARTxSTS_NT		0x00004000U

#define IDT_SWPARTxSTS_DMA		0x00008000U

/*
 * SWPORTxSTS register fields related constants
 * @IDT_SWPORTxSTS_OMCI:        Operation mode change initiated
 * @IDT_SWPORTxSTS_OMCC:        Operation mode change completed
 * @IDT_SWPORTxSTS_LINKUP:      Link up status
 * @IDT_SWPORTxSTS_DS:          Port lanes behave as downstream lanes
 * @IDT_SWPORTxSTS_MODE_MASK:   Port mode field mask
 * @IDT_SWPORTxSTS_MODE_FLD:    Port mode field offset
 * @IDT_SWPORTxSTS_MODE_DIS:    Port mode - disabled
 * @IDT_SWPORTxSTS_MODE_DS:     Port mode - downstream switch port
 * @IDT_SWPORTxSTS_MODE_US:     Port mode - upstream switch port
 * @IDT_SWPORTxSTS_MODE_NT:     Port mode - NT function
 * @IDT_SWPORTxSTS_MODE_USNT:   Port mode - upstream switch port with NTB
 * @IDT_SWPORTxSTS_MODE_UNAT:   Port mode - unattached
 * @IDT_SWPORTxSTS_MODE_USDMA:  Port mode - upstream switch port with DMA
 * @IDT_SWPORTxSTS_MODE_USNTDMA:Port mode - upstream port with NTB and DMA
 * @IDT_SWPORTxSTS_MODE_NTDMA:  Port mode - NT function with DMA
 * @IDT_SWPORTxSTS_SWPART_MASK: Port partition field mask
 * @IDT_SWPORTxSTS_SWPART_FLD:  Port partition field offset
 * @IDT_SWPORTxSTS_DEVNUM_MASK: Port device number field mask
 * @IDT_SWPORTxSTS_DEVNUM_FLD:  Port device number field offset
 */

#define IDT_SWPORTxSTS_OMCI		0x00000001U

#define IDT_SWPORTxSTS_OMCC		0x00000002U

#define IDT_SWPORTxSTS_LINKUP		0x00000010U

#define IDT_SWPORTxSTS_DS		0x00000020U

#define IDT_SWPORTxSTS_MODE_MASK	0x000003C0U

#define IDT_SWPORTxSTS_MODE_FLD		6

#define IDT_SWPORTxSTS_MODE_DIS		0x00000000U

#define IDT_SWPORTxSTS_MODE_DS		0x00000040U

#define IDT_SWPORTxSTS_MODE_US		0x00000080U

#define IDT_SWPORTxSTS_MODE_NT		0x000000C0U

#define IDT_SWPORTxSTS_MODE_USNT	0x00000100U

#define IDT_SWPORTxSTS_MODE_UNAT	0x00000140U

#define IDT_SWPORTxSTS_MODE_USDMA	0x00000180U

#define IDT_SWPORTxSTS_MODE_USNTDMA	0x000001C0U

#define IDT_SWPORTxSTS_MODE_NTDMA	0x00000200U

#define IDT_SWPORTxSTS_SWPART_MASK	0x00001C00U

#define IDT_SWPORTxSTS_SWPART_FLD	10

#define IDT_SWPORTxSTS_DEVNUM_MASK	0x001F0000U

#define IDT_SWPORTxSTS_DEVNUM_FLD	16

/*
 * SEMSK register fields related constants
 * @IDT_SEMSK_LINKUP:   Link Up event mask bit
 * @IDT_SEMSK_LINKDN:   Link Down event mask bit
 * @IDT_SEMSK_GSIGNAL:  Global Signal event mask bit
 */

#define IDT_SEMSK_LINKUP		0x00000001U

#define IDT_SEMSK_LINKDN		0x00000002U

#define IDT_SEMSK_GSIGNAL		0x00000020U

/*
 * SWPxMSGCTL register fields related constants
 * @IDT_SWPxMSGCTL_REG_MASK:    Register select field mask
 * @IDT_SWPxMSGCTL_REG_FLD:     Register select field offset
 * @IDT_SWPxMSGCTL_PART_MASK:   Partition select field mask
 * @IDT_SWPxMSGCTL_PART_FLD:    Partition select field offset
 */

#define IDT_SWPxMSGCTL_REG_MASK		0x00000003U

#define IDT_SWPxMSGCTL_REG_FLD		0

#define IDT_SWPxMSGCTL_PART_MASK	0x00000070U

#define IDT_SWPxMSGCTL_PART_FLD		4

/*
 * TMPSTS register fields related constants
 * @IDT_TMPSTS_TEMP_MASK:       Current temperature field mask
 * @IDT_TMPSTS_TEMP_FLD:        Current temperature field offset
 */

#define IDT_TMPSTS_TEMP_MASK		0x000000FFU

#define IDT_TMPSTS_TEMP_FLD		0

/*
 * Helper macro to get/set the corresponding field value
 * @GET_FIELD:          Retrieve the value of the corresponding field
 * @SET_FIELD:          Set the specified field up
 * @IS_FLD_SET:         Check whether a field is set with value
 */

#define GET_FIELD(field, data) \
	(((u32)(data) & IDT_ ##field## _MASK) >> IDT_ ##field## _FLD)

#define SET_FIELD(field, data, value) \
	(((u32)(data) & ~IDT_ ##field## _MASK) | \
         ((u32)(value) << IDT_ ##field## _FLD))

#define IS_FLD_SET(field, data, value) \
	(((u32)(data) & IDT_ ##field## _MASK) == IDT_ ##field## _ ##value)

/*
 * Useful registers masks:
 * @IDT_DBELL_MASK:     Doorbell bits mask
 * @IDT_OUTMSG_MASK:    Out messages status bits mask
 * @IDT_INMSG_MASK:     In messages status bits mask
 * @IDT_MSG_MASK:       Any message status bits mask
 */

#define IDT_DBELL_MASK		((u32)0xFFFFFFFFU)

#define IDT_OUTMSG_MASK		((u32)0x0000000FU)

#define IDT_INMSG_MASK		((u32)0x000F0000U)

#define IDT_MSG_MASK		(IDT_INMSG_MASK | IDT_OUTMSG_MASK)

/*
 * Number of IDT NTB resources:
 * @IDT_MSG_CNT:        Number of Message registers
 * @IDT_BAR_CNT:        Number of BARs of each port
 * @IDT_MTBL_ENTRY_CNT: Number mapping table entries
 */

#define IDT_MSG_CNT		4

#define IDT_BAR_CNT		6

#define IDT_MTBL_ENTRY_CNT	64

/*
 * General IDT PCIe-switch constant
 * @IDT_MAX_NR_PORTS:   Maximum number of ports per IDT PCIe-switch
 * @IDT_MAX_NR_PARTS:   Maximum number of partitions per IDT PCIe-switch
 * @IDT_MAX_NR_PEERS:   Maximum number of NT-peers per IDT PCIe-switch
 * @IDT_MAX_NR_MWS:     Maximum number of Memory Widows
 * @IDT_PCIE_REGSIZE:   Size of the registers in bytes
 * @IDT_TRANS_ALIGN:    Alignment of translated base address
 * @IDT_DIR_SIZE_ALIGN: Alignment of size setting for direct translated MWs.
 *                      Even though the lower 10 bits are reserved, they are
 *                      treated by IDT as one's so basically there is no any
 *                      alignment of size limit for DIR address translation.
 */

#define IDT_MAX_NR_PORTS	24

#define IDT_MAX_NR_PARTS	8

#define IDT_MAX_NR_PEERS	8

#define IDT_MAX_NR_MWS		29

#define IDT_PCIE_REGSIZE	4

#define IDT_TRANS_ALIGN		4

#define IDT_DIR_SIZE_ALIGN	1

/*
 * IDT Memory Windows type. Depending on the device settings, IDT supports
 * Direct Address Translation MW registers and Lookup Table registers
 * @IDT_MW_DIR:         Direct address translation
 * @IDT_MW_LUT12:       12-entry lookup table entry
 * @IDT_MW_LUT24:       24-entry lookup table entry
 *
 * NOTE These values are exactly the same as one of the BARSETUP ATRAN field
 */

enum idt_mw_type {
	
IDT_MW_DIR = 0x0,
	
IDT_MW_LUT12 = 0x1,
	
IDT_MW_LUT24 = 0x2
};

/*
 * IDT PCIe-switch model private data
 * @name:       Device name
 * @port_cnt:   Total number of NT endpoint ports
 * @ports:      Port ids
 */

struct idt_89hpes_cfg {
	
char *name;
	
unsigned char port_cnt;
	
unsigned char ports[];
};

/*
 * Memory window configuration structure
 * @type:       Type of the memory window (direct address translation or lookup
 *              table)
 *
 * @bar:        PCIe BAR the memory window referenced to
 * @idx:        Index of the memory window within the BAR
 *
 * @addr_align: Alignment of translated address
 * @size_align: Alignment of memory window size
 * @size_max:   Maximum size of memory window
 */

struct idt_mw_cfg {
	
enum idt_mw_type type;

	
unsigned char bar;
	
unsigned char idx;

	
u64 addr_align;
	
u64 size_align;
	
u64 size_max;
};

/*
 * Description structure of peer IDT NT-functions:
 * @port:               NT-function port
 * @part:               NT-function partition
 *
 * @mw_cnt:             Number of memory windows supported by NT-function
 * @mws:                Array of memory windows descriptors
 */

struct idt_ntb_peer {
	
unsigned char port;
	
unsigned char part;

	
unsigned char mw_cnt;
	
struct idt_mw_cfg *mws;
};

/*
 * Description structure of local IDT NT-function:
 * @ntb:                Linux NTB-device description structure
 * @swcfg:              Pointer to the structure of local IDT PCIe-switch
 *                      specific cofnfigurations
 *
 * @port:               Local NT-function port
 * @part:               Local NT-function partition
 *
 * @peer_cnt:           Number of peers with activated NTB-function
 * @peers:              Array of peers descripting structures
 * @port_idx_map:       Map of port number -> peer index
 * @part_idx_map:       Map of partition number -> peer index
 *
 * @mtbl_lock:          Mapping table access lock
 *
 * @mw_cnt:             Number of memory windows supported by NT-function
 * @mws:                Array of memory windows descriptors
 * @lut_lock:           Lookup table access lock
 *
 * @msg_locks:          Message registers mapping table lockers
 *
 * @cfgspc:             Virtual address of the memory mapped configuration
 *                      space of the NT-function
 * @db_mask_lock:       Doorbell mask register lock
 * @msg_mask_lock:      Message mask register lock
 * @gasa_lock:          GASA registers access lock
 *
 * @dbgfs_info:         DebugFS info node
 */

struct idt_ntb_dev {
	
struct ntb_dev ntb;
	
struct idt_89hpes_cfg *swcfg;

	
unsigned char port;
	
unsigned char part;

	
unsigned char peer_cnt;
	
struct idt_ntb_peer peers[IDT_MAX_NR_PEERS];
	
char port_idx_map[IDT_MAX_NR_PORTS];
	
char part_idx_map[IDT_MAX_NR_PARTS];

	
spinlock_t mtbl_lock;

	
unsigned char mw_cnt;
	
struct idt_mw_cfg *mws;
	
spinlock_t lut_lock;

	
spinlock_t msg_locks[IDT_MSG_CNT];

	
void __iomem *cfgspc;
	
spinlock_t db_mask_lock;
	
spinlock_t msg_mask_lock;
	
spinlock_t gasa_lock;

	
struct dentry *dbgfs_info;
};

#define to_ndev_ntb(__ntb) container_of(__ntb, struct idt_ntb_dev, ntb)

/*
 * Descriptor of the IDT PCIe-switch BAR resources
 * @setup:      BAR setup register
 * @limit:      BAR limit register
 * @ltbase:     Lower translated base address
 * @utbase:     Upper translated base address
 */

struct idt_ntb_bar {
	
unsigned int setup;
	
unsigned int limit;
	
unsigned int ltbase;
	
unsigned int utbase;
};

/*
 * Descriptor of the IDT PCIe-switch message resources
 * @in:         Inbound message register
 * @out:        Outbound message register
 * @src:        Source of inbound message register
 */

struct idt_ntb_msg {
	
unsigned int in;
	
unsigned int out;
	
unsigned int src;
};

/*
 * Descriptor of the IDT PCIe-switch NT-function specific parameters in the
 * PCI Configuration Space
 * @bars:       BARs related registers
 * @msgs:       Messaging related registers
 */

struct idt_ntb_regs {
	
struct idt_ntb_bar bars[IDT_BAR_CNT];
	
struct idt_ntb_msg msgs[IDT_MSG_CNT];
};

/*
 * Descriptor of the IDT PCIe-switch port specific parameters in the
 * Global Configuration Space
 * @pcicmdsts:   PCI command/status register
 * @pcielctlsts: PCIe link control/status
 *
 * @ctl:        Port control register
 * @sts:        Port status register
 *
 * @bars:       BARs related registers
 */

struct idt_ntb_port {
	
unsigned int pcicmdsts;
	
unsigned int pcielctlsts;
	
unsigned int ntctl;

	
unsigned int ctl;
	
unsigned int sts;

	
struct idt_ntb_bar bars[IDT_BAR_CNT];
};

/*
 * Descriptor of the IDT PCIe-switch partition specific parameters.
 * @ctl:        Partition control register in the Global Address Space
 * @sts:        Partition status register in the Global Address Space
 * @msgctl:     Messages control registers
 */

struct idt_ntb_part {
	
unsigned int ctl;
	
unsigned int sts;
	
unsigned int msgctl[IDT_MSG_CNT];
};

#endif /* NTB_HW_IDT_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Serge Semin2642100.00%1100.00%
Total2642100.00%1100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.