Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

scsi: elx: libefc_sli: SLI-4 register offsets and field definitions

This is the initial patch for the new Emulex target mode SCSI driver.

- Create the new Emulex source level directory drivers/scsi/elx and add
the directory to the MAINTAINERS file.

- Create the first library subdirectory drivers/scsi/elx/libefc_sli. This
library is a SLI-4 interface library.

- Start the population of the libefc_sli library with definitions of SLI-4
hardware register offsets and definitions.

Link: https://lore.kernel.org/r/20210601235512.20104-2-jsmart2021@gmail.com
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Daniel Wagner <dwagner@suse.de>
Co-developed-by: Ram Vegesna <ram.vegesna@broadcom.com>
Signed-off-by: Ram Vegesna <ram.vegesna@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

James Smart and committed by
Martin K. Petersen
edba59f3 4ee8c40b

+339
+9
MAINTAINERS
··· 6736 6736 W: http://www.broadcom.com 6737 6737 F: drivers/scsi/lpfc/ 6738 6738 6739 + EMULEX/BROADCOM EFCT FC/FCOE SCSI TARGET DRIVER 6740 + M: James Smart <james.smart@broadcom.com> 6741 + M: Ram Vegesna <ram.vegesna@broadcom.com> 6742 + L: linux-scsi@vger.kernel.org 6743 + L: target-devel@vger.kernel.org 6744 + S: Supported 6745 + W: http://www.broadcom.com 6746 + F: drivers/scsi/elx/ 6747 + 6739 6748 ENE CB710 FLASH CARD READER DRIVER 6740 6749 M: Michał Mirosław <mirq-linux@rere.qmqm.pl> 6741 6750 S: Maintained
+22
drivers/scsi/elx/libefc_sli/sli4.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2021 Broadcom. All Rights Reserved. The term 4 + * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 5 + */ 6 + 7 + /** 8 + * All common (i.e. transport-independent) SLI-4 functions are implemented 9 + * in this file. 10 + */ 11 + #include "sli4.h" 12 + 13 + static struct sli4_asic_entry_t sli4_asic_table[] = { 14 + { SLI4_ASIC_REV_B0, SLI4_ASIC_GEN_5}, 15 + { SLI4_ASIC_REV_D0, SLI4_ASIC_GEN_5}, 16 + { SLI4_ASIC_REV_A3, SLI4_ASIC_GEN_6}, 17 + { SLI4_ASIC_REV_A0, SLI4_ASIC_GEN_6}, 18 + { SLI4_ASIC_REV_A1, SLI4_ASIC_GEN_6}, 19 + { SLI4_ASIC_REV_A3, SLI4_ASIC_GEN_6}, 20 + { SLI4_ASIC_REV_A1, SLI4_ASIC_GEN_7}, 21 + { SLI4_ASIC_REV_A0, SLI4_ASIC_GEN_7}, 22 + };
+308
drivers/scsi/elx/libefc_sli/sli4.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2021 Broadcom. All Rights Reserved. The term 4 + * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 5 + * 6 + */ 7 + 8 + /* 9 + * All common SLI-4 structures and function prototypes. 10 + */ 11 + 12 + #ifndef _SLI4_H 13 + #define _SLI4_H 14 + 15 + #include <linux/pci.h> 16 + #include <linux/delay.h> 17 + #include "scsi/fc/fc_els.h" 18 + #include "scsi/fc/fc_fs.h" 19 + #include "../include/efc_common.h" 20 + 21 + /************************************************************************* 22 + * Common SLI-4 register offsets and field definitions 23 + */ 24 + 25 + /* SLI_INTF - SLI Interface Definition Register */ 26 + #define SLI4_INTF_REG 0x0058 27 + enum sli4_intf { 28 + SLI4_INTF_REV_SHIFT = 4, 29 + SLI4_INTF_REV_MASK = 0xf0, 30 + 31 + SLI4_INTF_REV_S3 = 0x30, 32 + SLI4_INTF_REV_S4 = 0x40, 33 + 34 + SLI4_INTF_FAMILY_SHIFT = 8, 35 + SLI4_INTF_FAMILY_MASK = 0x0f00, 36 + 37 + SLI4_FAMILY_CHECK_ASIC_TYPE = 0x0f00, 38 + 39 + SLI4_INTF_IF_TYPE_SHIFT = 12, 40 + SLI4_INTF_IF_TYPE_MASK = 0xf000, 41 + 42 + SLI4_INTF_IF_TYPE_2 = 0x2000, 43 + SLI4_INTF_IF_TYPE_6 = 0x6000, 44 + 45 + SLI4_INTF_VALID_SHIFT = 29, 46 + SLI4_INTF_VALID_MASK = 0xe0000000, 47 + 48 + SLI4_INTF_VALID_VALUE = 0xc0000000, 49 + }; 50 + 51 + /* ASIC_ID - SLI ASIC Type and Revision Register */ 52 + #define SLI4_ASIC_ID_REG 0x009c 53 + enum sli4_asic { 54 + SLI4_ASIC_GEN_SHIFT = 8, 55 + SLI4_ASIC_GEN_MASK = 0xff00, 56 + SLI4_ASIC_GEN_5 = 0x0b00, 57 + SLI4_ASIC_GEN_6 = 0x0c00, 58 + SLI4_ASIC_GEN_7 = 0x0d00, 59 + }; 60 + 61 + enum sli4_acic_revisions { 62 + SLI4_ASIC_REV_A0 = 0x00, 63 + SLI4_ASIC_REV_A1 = 0x01, 64 + SLI4_ASIC_REV_A2 = 0x02, 65 + SLI4_ASIC_REV_A3 = 0x03, 66 + SLI4_ASIC_REV_B0 = 0x10, 67 + SLI4_ASIC_REV_B1 = 0x11, 68 + SLI4_ASIC_REV_B2 = 0x12, 69 + SLI4_ASIC_REV_C0 = 0x20, 70 + SLI4_ASIC_REV_C1 = 0x21, 71 + SLI4_ASIC_REV_C2 = 0x22, 72 + SLI4_ASIC_REV_D0 = 0x30, 73 + }; 74 + 75 + struct sli4_asic_entry_t { 76 + u32 rev_id; 77 + u32 family; 78 + }; 79 + 80 + /* BMBX - Bootstrap Mailbox Register */ 81 + #define SLI4_BMBX_REG 0x0160 82 + enum sli4_bmbx { 83 + SLI4_BMBX_MASK_HI = 0x3, 84 + SLI4_BMBX_MASK_LO = 0xf, 85 + SLI4_BMBX_RDY = 1 << 0, 86 + SLI4_BMBX_HI = 1 << 1, 87 + SLI4_BMBX_SIZE = 256, 88 + }; 89 + 90 + static inline u32 91 + sli_bmbx_write_hi(u64 addr) { 92 + u32 val; 93 + 94 + val = upper_32_bits(addr) & ~SLI4_BMBX_MASK_HI; 95 + val |= SLI4_BMBX_HI; 96 + 97 + return val; 98 + } 99 + 100 + static inline u32 101 + sli_bmbx_write_lo(u64 addr) { 102 + u32 val; 103 + 104 + val = (upper_32_bits(addr) & SLI4_BMBX_MASK_HI) << 30; 105 + val |= ((addr) & ~SLI4_BMBX_MASK_LO) >> 2; 106 + 107 + return val; 108 + } 109 + 110 + /* SLIPORT_CONTROL - SLI Port Control Register */ 111 + #define SLI4_PORT_CTRL_REG 0x0408 112 + enum sli4_port_ctrl { 113 + SLI4_PORT_CTRL_IP = 1u << 27, 114 + SLI4_PORT_CTRL_IDIS = 1u << 22, 115 + SLI4_PORT_CTRL_FDD = 1u << 31, 116 + }; 117 + 118 + /* SLI4_SLIPORT_ERROR - SLI Port Error Register */ 119 + #define SLI4_PORT_ERROR1 0x040c 120 + #define SLI4_PORT_ERROR2 0x0410 121 + 122 + /* EQCQ_DOORBELL - EQ and CQ Doorbell Register */ 123 + #define SLI4_EQCQ_DB_REG 0x120 124 + enum sli4_eqcq_e { 125 + SLI4_EQ_ID_LO_MASK = 0x01ff, 126 + 127 + SLI4_CQ_ID_LO_MASK = 0x03ff, 128 + 129 + SLI4_EQCQ_CI_EQ = 0x0200, 130 + 131 + SLI4_EQCQ_QT_EQ = 0x00000400, 132 + SLI4_EQCQ_QT_CQ = 0x00000000, 133 + 134 + SLI4_EQCQ_ID_HI_SHIFT = 11, 135 + SLI4_EQCQ_ID_HI_MASK = 0xf800, 136 + 137 + SLI4_EQCQ_NUM_SHIFT = 16, 138 + SLI4_EQCQ_NUM_MASK = 0x1fff0000, 139 + 140 + SLI4_EQCQ_ARM = 0x20000000, 141 + SLI4_EQCQ_UNARM = 0x00000000, 142 + }; 143 + 144 + static inline u32 145 + sli_format_eq_db_data(u16 num_popped, u16 id, u32 arm) { 146 + u32 reg; 147 + 148 + reg = (id & SLI4_EQ_ID_LO_MASK) | SLI4_EQCQ_QT_EQ; 149 + reg |= (((id) >> 9) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK; 150 + reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK; 151 + reg |= arm | SLI4_EQCQ_CI_EQ; 152 + 153 + return reg; 154 + } 155 + 156 + static inline u32 157 + sli_format_cq_db_data(u16 num_popped, u16 id, u32 arm) { 158 + u32 reg; 159 + 160 + reg = ((id) & SLI4_CQ_ID_LO_MASK) | SLI4_EQCQ_QT_CQ; 161 + reg |= (((id) >> 10) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK; 162 + reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK; 163 + reg |= arm; 164 + 165 + return reg; 166 + } 167 + 168 + /* EQ_DOORBELL - EQ Doorbell Register for IF_TYPE = 6*/ 169 + #define SLI4_IF6_EQ_DB_REG 0x120 170 + enum sli4_eq_e { 171 + SLI4_IF6_EQ_ID_MASK = 0x0fff, 172 + 173 + SLI4_IF6_EQ_NUM_SHIFT = 16, 174 + SLI4_IF6_EQ_NUM_MASK = 0x1fff0000, 175 + }; 176 + 177 + static inline u32 178 + sli_format_if6_eq_db_data(u16 num_popped, u16 id, u32 arm) { 179 + u32 reg; 180 + 181 + reg = id & SLI4_IF6_EQ_ID_MASK; 182 + reg |= (num_popped << SLI4_IF6_EQ_NUM_SHIFT) & SLI4_IF6_EQ_NUM_MASK; 183 + reg |= arm; 184 + 185 + return reg; 186 + } 187 + 188 + /* CQ_DOORBELL - CQ Doorbell Register for IF_TYPE = 6 */ 189 + #define SLI4_IF6_CQ_DB_REG 0xc0 190 + enum sli4_cq_e { 191 + SLI4_IF6_CQ_ID_MASK = 0xffff, 192 + 193 + SLI4_IF6_CQ_NUM_SHIFT = 16, 194 + SLI4_IF6_CQ_NUM_MASK = 0x1fff0000, 195 + }; 196 + 197 + static inline u32 198 + sli_format_if6_cq_db_data(u16 num_popped, u16 id, u32 arm) { 199 + u32 reg; 200 + 201 + reg = id & SLI4_IF6_CQ_ID_MASK; 202 + reg |= ((num_popped) << SLI4_IF6_CQ_NUM_SHIFT) & SLI4_IF6_CQ_NUM_MASK; 203 + reg |= arm; 204 + 205 + return reg; 206 + } 207 + 208 + /* MQ_DOORBELL - MQ Doorbell Register */ 209 + #define SLI4_MQ_DB_REG 0x0140 210 + #define SLI4_IF6_MQ_DB_REG 0x0160 211 + enum sli4_mq_e { 212 + SLI4_MQ_ID_MASK = 0xffff, 213 + 214 + SLI4_MQ_NUM_SHIFT = 16, 215 + SLI4_MQ_NUM_MASK = 0x3fff0000, 216 + }; 217 + 218 + static inline u32 219 + sli_format_mq_db_data(u16 id) { 220 + u32 reg; 221 + 222 + reg = id & SLI4_MQ_ID_MASK; 223 + reg |= (1 << SLI4_MQ_NUM_SHIFT) & SLI4_MQ_NUM_MASK; 224 + 225 + return reg; 226 + } 227 + 228 + /* RQ_DOORBELL - RQ Doorbell Register */ 229 + #define SLI4_RQ_DB_REG 0x0a0 230 + #define SLI4_IF6_RQ_DB_REG 0x0080 231 + enum sli4_rq_e { 232 + SLI4_RQ_DB_ID_MASK = 0xffff, 233 + 234 + SLI4_RQ_DB_NUM_SHIFT = 16, 235 + SLI4_RQ_DB_NUM_MASK = 0x3fff0000, 236 + }; 237 + 238 + static inline u32 239 + sli_format_rq_db_data(u16 id) { 240 + u32 reg; 241 + 242 + reg = id & SLI4_RQ_DB_ID_MASK; 243 + reg |= (1 << SLI4_RQ_DB_NUM_SHIFT) & SLI4_RQ_DB_NUM_MASK; 244 + 245 + return reg; 246 + } 247 + 248 + /* WQ_DOORBELL - WQ Doorbell Register */ 249 + #define SLI4_IO_WQ_DB_REG 0x040 250 + #define SLI4_IF6_WQ_DB_REG 0x040 251 + enum sli4_wq_e { 252 + SLI4_WQ_ID_MASK = 0xffff, 253 + 254 + SLI4_WQ_IDX_SHIFT = 16, 255 + SLI4_WQ_IDX_MASK = 0xff0000, 256 + 257 + SLI4_WQ_NUM_SHIFT = 24, 258 + SLI4_WQ_NUM_MASK = 0x0ff00000, 259 + }; 260 + 261 + static inline u32 262 + sli_format_wq_db_data(u16 id) { 263 + u32 reg; 264 + 265 + reg = id & SLI4_WQ_ID_MASK; 266 + reg |= (1 << SLI4_WQ_NUM_SHIFT) & SLI4_WQ_NUM_MASK; 267 + 268 + return reg; 269 + } 270 + 271 + /* SLIPORT_STATUS - SLI Port Status Register */ 272 + #define SLI4_PORT_STATUS_REGOFF 0x0404 273 + enum sli4_port_status { 274 + SLI4_PORT_STATUS_FDP = 1u << 21, 275 + SLI4_PORT_STATUS_RDY = 1u << 23, 276 + SLI4_PORT_STATUS_RN = 1u << 24, 277 + SLI4_PORT_STATUS_DIP = 1u << 25, 278 + SLI4_PORT_STATUS_OTI = 1u << 29, 279 + SLI4_PORT_STATUS_ERR = 1u << 31, 280 + }; 281 + 282 + #define SLI4_PHYDEV_CTRL_REG 0x0414 283 + #define SLI4_PHYDEV_CTRL_FRST (1 << 1) 284 + #define SLI4_PHYDEV_CTRL_DD (1 << 2) 285 + 286 + /* Register name enums */ 287 + enum sli4_regname_en { 288 + SLI4_REG_BMBX, 289 + SLI4_REG_EQ_DOORBELL, 290 + SLI4_REG_CQ_DOORBELL, 291 + SLI4_REG_RQ_DOORBELL, 292 + SLI4_REG_IO_WQ_DOORBELL, 293 + SLI4_REG_MQ_DOORBELL, 294 + SLI4_REG_PHYSDEV_CONTROL, 295 + SLI4_REG_PORT_CONTROL, 296 + SLI4_REG_PORT_ERROR1, 297 + SLI4_REG_PORT_ERROR2, 298 + SLI4_REG_PORT_SEMAPHORE, 299 + SLI4_REG_PORT_STATUS, 300 + SLI4_REG_UNKWOWN /* must be last */ 301 + }; 302 + 303 + struct sli4_reg { 304 + u32 rset; 305 + u32 off; 306 + }; 307 + 308 + #endif /* !_SLI4_H */