scsi: lpfc: NVME Initiator: Base modifications
NVME Initiator: Base modifications This patch adds base modifications for NVME initiator support. The base modifications consist of: - Formal split of SLI3 rings from SLI-4 WQs (sometimes referred to as rings as well) as implementation now widely varies between the two. - Addition of configuration modes: SCSI initiator only; NVME initiator only; NVME target only; and SCSI and NVME initiator. The configuration mode drives overall adapter configuration, offloads enabled, and resource splits. NVME support is only available on SLI-4 devices and newer fw. - Implements the following based on configuration mode: - Exchange resources are split by protocol; Obviously, if only 1 mode, then no split occurs. Default is 50/50. module attribute allows tuning. - Pools and config parameters are separated per-protocol - Each protocol has it's own set of queues, but share interrupt vectors. SCSI: SLI3 devices have few queues and the original style of queue allocation remains. SLI4 devices piggy back on an "io-channel" concept that eventually needs to merge with scsi-mq/blk-mq support (it is underway). For now, the paradigm continues as it existed prior. io channel allocates N msix and N WQs (N=4 default) and either round robins or uses cpu # modulo N for scheduling. A bunch of module parameters allow the configuration to be tuned. NVME (initiator): Allocates an msix per cpu (or whatever pci_alloc_irq_vectors gets) Allocates a WQ per cpu, and maps the WQs to msix on a WQ # modulo msix vector count basis. Module parameters exist to cap/control the config if desired. - Each protocol has its own buffer and dma pools. I apologize for the size of the patch. Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <james.smart@broadcom.com> ---- Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:

committed by
Martin K. Petersen

parent
1d9d5a9879
commit
895427bd01
@@ -108,6 +108,7 @@ struct lpfc_sli_intf {
|
||||
#define LPFC_MAX_MQ_PAGE 8
|
||||
#define LPFC_MAX_WQ_PAGE_V0 4
|
||||
#define LPFC_MAX_WQ_PAGE 8
|
||||
#define LPFC_MAX_RQ_PAGE 8
|
||||
#define LPFC_MAX_CQ_PAGE 4
|
||||
#define LPFC_MAX_EQ_PAGE 8
|
||||
|
||||
@@ -198,7 +199,7 @@ struct lpfc_sli_intf {
|
||||
/* Configuration of Interrupts / sec for entire HBA port */
|
||||
#define LPFC_MIN_IMAX 5000
|
||||
#define LPFC_MAX_IMAX 5000000
|
||||
#define LPFC_DEF_IMAX 50000
|
||||
#define LPFC_DEF_IMAX 150000
|
||||
|
||||
#define LPFC_MIN_CPU_MAP 0
|
||||
#define LPFC_MAX_CPU_MAP 2
|
||||
@@ -348,6 +349,7 @@ struct lpfc_cqe {
|
||||
#define CQE_CODE_RECEIVE 0x4
|
||||
#define CQE_CODE_XRI_ABORTED 0x5
|
||||
#define CQE_CODE_RECEIVE_V1 0x9
|
||||
#define CQE_CODE_NVME_ERSP 0xd
|
||||
|
||||
/*
|
||||
* Define mask value for xri_aborted and wcqe completed CQE extended status.
|
||||
@@ -367,6 +369,9 @@ struct lpfc_wcqe_complete {
|
||||
#define lpfc_wcqe_c_hw_status_SHIFT 0
|
||||
#define lpfc_wcqe_c_hw_status_MASK 0x000000FF
|
||||
#define lpfc_wcqe_c_hw_status_WORD word0
|
||||
#define lpfc_wcqe_c_ersp0_SHIFT 0
|
||||
#define lpfc_wcqe_c_ersp0_MASK 0x0000FFFF
|
||||
#define lpfc_wcqe_c_ersp0_WORD word0
|
||||
uint32_t total_data_placed;
|
||||
uint32_t parameter;
|
||||
#define lpfc_wcqe_c_bg_edir_SHIFT 5
|
||||
@@ -400,6 +405,9 @@ struct lpfc_wcqe_complete {
|
||||
#define lpfc_wcqe_c_code_SHIFT lpfc_cqe_code_SHIFT
|
||||
#define lpfc_wcqe_c_code_MASK lpfc_cqe_code_MASK
|
||||
#define lpfc_wcqe_c_code_WORD lpfc_cqe_code_WORD
|
||||
#define lpfc_wcqe_c_sqhead_SHIFT 0
|
||||
#define lpfc_wcqe_c_sqhead_MASK 0x0000FFFF
|
||||
#define lpfc_wcqe_c_sqhead_WORD word3
|
||||
};
|
||||
|
||||
/* completion queue entry for wqe release */
|
||||
@@ -2841,12 +2849,18 @@ struct lpfc_sli4_parameters {
|
||||
#define cfg_mqv_WORD word6
|
||||
uint32_t word7;
|
||||
uint32_t word8;
|
||||
#define cfg_wqpcnt_SHIFT 0
|
||||
#define cfg_wqpcnt_MASK 0x0000000f
|
||||
#define cfg_wqpcnt_WORD word8
|
||||
#define cfg_wqsize_SHIFT 8
|
||||
#define cfg_wqsize_MASK 0x0000000f
|
||||
#define cfg_wqsize_WORD word8
|
||||
#define cfg_wqv_SHIFT 14
|
||||
#define cfg_wqv_MASK 0x00000003
|
||||
#define cfg_wqv_WORD word8
|
||||
#define cfg_wqpsize_SHIFT 16
|
||||
#define cfg_wqpsize_MASK 0x000000ff
|
||||
#define cfg_wqpsize_WORD word8
|
||||
uint32_t word9;
|
||||
uint32_t word10;
|
||||
#define cfg_rqv_SHIFT 14
|
||||
@@ -2897,6 +2911,12 @@ struct lpfc_sli4_parameters {
|
||||
#define cfg_mds_diags_SHIFT 1
|
||||
#define cfg_mds_diags_MASK 0x00000001
|
||||
#define cfg_mds_diags_WORD word19
|
||||
#define cfg_nvme_SHIFT 3
|
||||
#define cfg_nvme_MASK 0x00000001
|
||||
#define cfg_nvme_WORD word19
|
||||
#define cfg_xib_SHIFT 4
|
||||
#define cfg_xib_MASK 0x00000001
|
||||
#define cfg_xib_WORD word19
|
||||
};
|
||||
|
||||
#define LPFC_SET_UE_RECOVERY 0x10
|
||||
@@ -3659,6 +3679,9 @@ struct wqe_common {
|
||||
#define wqe_ebde_cnt_SHIFT 0
|
||||
#define wqe_ebde_cnt_MASK 0x0000000f
|
||||
#define wqe_ebde_cnt_WORD word10
|
||||
#define wqe_nvme_SHIFT 4
|
||||
#define wqe_nvme_MASK 0x00000001
|
||||
#define wqe_nvme_WORD word10
|
||||
#define wqe_oas_SHIFT 6
|
||||
#define wqe_oas_MASK 0x00000001
|
||||
#define wqe_oas_WORD word10
|
||||
@@ -4017,11 +4040,39 @@ struct lpfc_grp_hdr {
|
||||
uint8_t revision[32];
|
||||
};
|
||||
|
||||
#define FCP_COMMAND 0x0
|
||||
#define FCP_COMMAND_DATA_OUT 0x1
|
||||
#define ELS_COMMAND_NON_FIP 0xC
|
||||
#define ELS_COMMAND_FIP 0xD
|
||||
#define OTHER_COMMAND 0x8
|
||||
/* Defines for WQE command type */
|
||||
#define FCP_COMMAND 0x0
|
||||
#define NVME_READ_CMD 0x0
|
||||
#define FCP_COMMAND_DATA_OUT 0x1
|
||||
#define NVME_WRITE_CMD 0x1
|
||||
#define FCP_COMMAND_TRECEIVE 0x2
|
||||
#define FCP_COMMAND_TRSP 0x3
|
||||
#define FCP_COMMAND_TSEND 0x7
|
||||
#define OTHER_COMMAND 0x8
|
||||
#define ELS_COMMAND_NON_FIP 0xC
|
||||
#define ELS_COMMAND_FIP 0xD
|
||||
|
||||
#define LPFC_NVME_EMBED_CMD 0x0
|
||||
#define LPFC_NVME_EMBED_WRITE 0x1
|
||||
#define LPFC_NVME_EMBED_READ 0x2
|
||||
|
||||
/* WQE Commands */
|
||||
#define CMD_ABORT_XRI_WQE 0x0F
|
||||
#define CMD_XMIT_SEQUENCE64_WQE 0x82
|
||||
#define CMD_XMIT_BCAST64_WQE 0x84
|
||||
#define CMD_ELS_REQUEST64_WQE 0x8A
|
||||
#define CMD_XMIT_ELS_RSP64_WQE 0x95
|
||||
#define CMD_XMIT_BLS_RSP64_WQE 0x97
|
||||
#define CMD_FCP_IWRITE64_WQE 0x98
|
||||
#define CMD_FCP_IREAD64_WQE 0x9A
|
||||
#define CMD_FCP_ICMND64_WQE 0x9C
|
||||
#define CMD_FCP_TSEND64_WQE 0x9F
|
||||
#define CMD_FCP_TRECEIVE64_WQE 0xA1
|
||||
#define CMD_FCP_TRSP64_WQE 0xA3
|
||||
#define CMD_GEN_REQUEST64_WQE 0xC2
|
||||
|
||||
#define CMD_WQE_MASK 0xff
|
||||
|
||||
|
||||
#define LPFC_FW_DUMP 1
|
||||
#define LPFC_FW_RESET 2
|
||||
|
Reference in New Issue
Block a user