NTB: switchtec: Add NTB hardware register definitions
authorLogan Gunthorpe <logang@deltatee.com>
Thu, 3 Aug 2017 18:19:42 +0000 (12:19 -0600)
committerJon Mason <jdmason@kudzu.us>
Sun, 19 Nov 2017 01:37:11 +0000 (20:37 -0500)
There are two additional regions: ctrl and dbmsg. The first is
for generic NTB control and memory windows. The second is for doorbells
and message registers. This patch also adds a number of related
constants for using these registers.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Reviewed-by: Stephen Bates <sbates@raithlin.com>
Reviewed-by: Kurt Schwemmer <kurt.schwemmer@microsemi.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
include/linux/switchtec.h

index 18e3881..9c2be76 100644 (file)
@@ -156,6 +156,12 @@ struct flash_info_regs {
        struct partition_info vendor[8];
 };
 
+enum {
+       SWITCHTEC_NTB_REG_INFO_OFFSET   = 0x0000,
+       SWITCHTEC_NTB_REG_CTRL_OFFSET   = 0x4000,
+       SWITCHTEC_NTB_REG_DBMSG_OFFSET  = 0x64000,
+};
+
 struct ntb_info_regs {
        u8  partition_count;
        u8  partition_id;
@@ -191,6 +197,84 @@ struct part_cfg_regs {
 } __packed;
 
 enum {
+       NTB_CTRL_PART_OP_LOCK = 0x1,
+       NTB_CTRL_PART_OP_CFG = 0x2,
+       NTB_CTRL_PART_OP_RESET = 0x3,
+
+       NTB_CTRL_PART_STATUS_NORMAL = 0x1,
+       NTB_CTRL_PART_STATUS_LOCKED = 0x2,
+       NTB_CTRL_PART_STATUS_LOCKING = 0x3,
+       NTB_CTRL_PART_STATUS_CONFIGURING = 0x4,
+       NTB_CTRL_PART_STATUS_RESETTING = 0x5,
+
+       NTB_CTRL_BAR_VALID = 1 << 0,
+       NTB_CTRL_BAR_DIR_WIN_EN = 1 << 4,
+       NTB_CTRL_BAR_LUT_WIN_EN = 1 << 5,
+
+       NTB_CTRL_REQ_ID_EN = 1 << 0,
+
+       NTB_CTRL_LUT_EN = 1 << 0,
+
+       NTB_PART_CTRL_ID_PROT_DIS = 1 << 0,
+};
+
+struct ntb_ctrl_regs {
+       u32 partition_status;
+       u32 partition_op;
+       u32 partition_ctrl;
+       u32 bar_setup;
+       u32 bar_error;
+       u16 lut_table_entries;
+       u16 lut_table_offset;
+       u32 lut_error;
+       u16 req_id_table_size;
+       u16 req_id_table_offset;
+       u32 req_id_error;
+       u32 reserved1[7];
+       struct {
+               u32 ctl;
+               u32 win_size;
+               u64 xlate_addr;
+       } bar_entry[6];
+       u32 reserved2[216];
+       u32 req_id_table[256];
+       u32 reserved3[512];
+       u64 lut_entry[512];
+} __packed;
+
+#define NTB_DBMSG_IMSG_STATUS BIT_ULL(32)
+#define NTB_DBMSG_IMSG_MASK   BIT_ULL(40)
+
+struct ntb_dbmsg_regs {
+       u32 reserved1[1024];
+       u64 odb;
+       u64 odb_mask;
+       u64 idb;
+       u64 idb_mask;
+       u8  idb_vec_map[64];
+       u32 msg_map;
+       u32 reserved2;
+       struct {
+               u32 msg;
+               u32 status;
+       } omsg[4];
+
+       struct {
+               u32 msg;
+               u8  status;
+               u8  mask;
+               u8  src;
+               u8  reserved;
+       } imsg[4];
+
+       u8 reserved3[3928];
+       u8 msix_table[1024];
+       u8 reserved4[3072];
+       u8 pba[24];
+       u8 reserved5[4072];
+} __packed;
+
+enum {
        SWITCHTEC_PART_CFG_EVENT_RESET = 1 << 0,
        SWITCHTEC_PART_CFG_EVENT_MRPC_CMP = 1 << 1,
        SWITCHTEC_PART_CFG_EVENT_MRPC_ASYNC_CMP = 1 << 2,