111e25f0dSDavid C Somayajulu /* 211e25f0dSDavid C Somayajulu * Copyright (c) 2017-2018 Cavium, Inc. 311e25f0dSDavid C Somayajulu * All rights reserved. 411e25f0dSDavid C Somayajulu * 511e25f0dSDavid C Somayajulu * Redistribution and use in source and binary forms, with or without 611e25f0dSDavid C Somayajulu * modification, are permitted provided that the following conditions 711e25f0dSDavid C Somayajulu * are met: 811e25f0dSDavid C Somayajulu * 911e25f0dSDavid C Somayajulu * 1. Redistributions of source code must retain the above copyright 1011e25f0dSDavid C Somayajulu * notice, this list of conditions and the following disclaimer. 1111e25f0dSDavid C Somayajulu * 2. Redistributions in binary form must reproduce the above copyright 1211e25f0dSDavid C Somayajulu * notice, this list of conditions and the following disclaimer in the 1311e25f0dSDavid C Somayajulu * documentation and/or other materials provided with the distribution. 1411e25f0dSDavid C Somayajulu * 1511e25f0dSDavid C Somayajulu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1611e25f0dSDavid C Somayajulu * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1711e25f0dSDavid C Somayajulu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1811e25f0dSDavid C Somayajulu * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 1911e25f0dSDavid C Somayajulu * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2011e25f0dSDavid C Somayajulu * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2111e25f0dSDavid C Somayajulu * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2211e25f0dSDavid C Somayajulu * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2311e25f0dSDavid C Somayajulu * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2411e25f0dSDavid C Somayajulu * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2511e25f0dSDavid C Somayajulu * POSSIBILITY OF SUCH DAMAGE. 2611e25f0dSDavid C Somayajulu * 2711e25f0dSDavid C Somayajulu */ 2811e25f0dSDavid C Somayajulu 2911e25f0dSDavid C Somayajulu #ifndef __STORAGE_COMMON__ 3011e25f0dSDavid C Somayajulu #define __STORAGE_COMMON__ 3111e25f0dSDavid C Somayajulu /*********************/ 3211e25f0dSDavid C Somayajulu /* SCSI CONSTANTS */ 3311e25f0dSDavid C Somayajulu /*********************/ 3411e25f0dSDavid C Somayajulu 35*217ec208SDavid C Somayajulu #define SCSI_MAX_NUM_OF_CMDQS (NUM_OF_GLOBAL_QUEUES / 2) 3611e25f0dSDavid C Somayajulu // Each Resource ID is one-one-valued mapped by the driver to a BDQ Resource ID (for instance per port) 3711e25f0dSDavid C Somayajulu #define BDQ_NUM_RESOURCES (4) 3811e25f0dSDavid C Somayajulu 399efd0ba7SDavid C Somayajulu // ID 0 : RQ, ID 1 : IMMEDIATE_DATA, ID 2 : TQ 4011e25f0dSDavid C Somayajulu #define BDQ_ID_RQ (0) 4111e25f0dSDavid C Somayajulu #define BDQ_ID_IMM_DATA (1) 429efd0ba7SDavid C Somayajulu #define BDQ_ID_TQ (2) 439efd0ba7SDavid C Somayajulu #define BDQ_NUM_IDS (3) 4411e25f0dSDavid C Somayajulu 4511e25f0dSDavid C Somayajulu #define SCSI_NUM_SGES_SLOW_SGL_THR 8 4611e25f0dSDavid C Somayajulu 4711e25f0dSDavid C Somayajulu #define BDQ_MAX_EXTERNAL_RING_SIZE (1<<15) 4811e25f0dSDavid C Somayajulu 499efd0ba7SDavid C Somayajulu /* SCSI op codes */ 509efd0ba7SDavid C Somayajulu #define SCSI_OPCODE_COMPARE_AND_WRITE (0x89) 51*217ec208SDavid C Somayajulu #define SCSI_OPCODE_READ_10 (0x28) 529efd0ba7SDavid C Somayajulu #define SCSI_OPCODE_WRITE_6 (0x0A) 539efd0ba7SDavid C Somayajulu #define SCSI_OPCODE_WRITE_10 (0x2A) 549efd0ba7SDavid C Somayajulu #define SCSI_OPCODE_WRITE_12 (0xAA) 559efd0ba7SDavid C Somayajulu #define SCSI_OPCODE_WRITE_16 (0x8A) 569efd0ba7SDavid C Somayajulu #define SCSI_OPCODE_WRITE_AND_VERIFY_10 (0x2E) 579efd0ba7SDavid C Somayajulu #define SCSI_OPCODE_WRITE_AND_VERIFY_12 (0xAE) 589efd0ba7SDavid C Somayajulu #define SCSI_OPCODE_WRITE_AND_VERIFY_16 (0x8E) 599efd0ba7SDavid C Somayajulu 609efd0ba7SDavid C Somayajulu /* 619efd0ba7SDavid C Somayajulu * iSCSI Drv opaque 629efd0ba7SDavid C Somayajulu */ 639efd0ba7SDavid C Somayajulu struct iscsi_drv_opaque 649efd0ba7SDavid C Somayajulu { 659efd0ba7SDavid C Somayajulu __le16 reserved_zero[3]; 669efd0ba7SDavid C Somayajulu __le16 opaque; 679efd0ba7SDavid C Somayajulu }; 6811e25f0dSDavid C Somayajulu 699efd0ba7SDavid C Somayajulu /* 709efd0ba7SDavid C Somayajulu * Scsi 2B/8B opaque union 719efd0ba7SDavid C Somayajulu */ 729efd0ba7SDavid C Somayajulu union scsi_opaque 739efd0ba7SDavid C Somayajulu { 749efd0ba7SDavid C Somayajulu struct regpair fcoe_opaque /* 8 Bytes opaque */; 759efd0ba7SDavid C Somayajulu struct iscsi_drv_opaque iscsi_opaque /* 2 Bytes opaque */; 769efd0ba7SDavid C Somayajulu }; 7711e25f0dSDavid C Somayajulu 7811e25f0dSDavid C Somayajulu /* 7911e25f0dSDavid C Somayajulu * SCSI buffer descriptor 8011e25f0dSDavid C Somayajulu */ 8111e25f0dSDavid C Somayajulu struct scsi_bd 8211e25f0dSDavid C Somayajulu { 8311e25f0dSDavid C Somayajulu struct regpair address /* Physical Address of buffer */; 849efd0ba7SDavid C Somayajulu union scsi_opaque opaque /* Driver Metadata (preferably Virtual Address of buffer) */; 8511e25f0dSDavid C Somayajulu }; 8611e25f0dSDavid C Somayajulu 8711e25f0dSDavid C Somayajulu /* 8811e25f0dSDavid C Somayajulu * Scsi Drv BDQ struct 8911e25f0dSDavid C Somayajulu */ 9011e25f0dSDavid C Somayajulu struct scsi_bdq_ram_drv_data 9111e25f0dSDavid C Somayajulu { 9211e25f0dSDavid C Somayajulu __le16 external_producer /* BDQ External Producer; updated by driver when it loads BDs to External Ring */; 9311e25f0dSDavid C Somayajulu __le16 reserved0[3]; 9411e25f0dSDavid C Somayajulu }; 9511e25f0dSDavid C Somayajulu 9611e25f0dSDavid C Somayajulu /* 9711e25f0dSDavid C Somayajulu * SCSI SGE entry 9811e25f0dSDavid C Somayajulu */ 9911e25f0dSDavid C Somayajulu struct scsi_sge 10011e25f0dSDavid C Somayajulu { 10111e25f0dSDavid C Somayajulu struct regpair sge_addr /* SGE address */; 10211e25f0dSDavid C Somayajulu __le32 sge_len /* SGE length */; 10311e25f0dSDavid C Somayajulu __le32 reserved; 10411e25f0dSDavid C Somayajulu }; 10511e25f0dSDavid C Somayajulu 10611e25f0dSDavid C Somayajulu /* 10711e25f0dSDavid C Somayajulu * Cached SGEs section 10811e25f0dSDavid C Somayajulu */ 10911e25f0dSDavid C Somayajulu struct scsi_cached_sges 11011e25f0dSDavid C Somayajulu { 11111e25f0dSDavid C Somayajulu struct scsi_sge sge[4] /* Cached SGEs section */; 11211e25f0dSDavid C Somayajulu }; 11311e25f0dSDavid C Somayajulu 11411e25f0dSDavid C Somayajulu /* 11511e25f0dSDavid C Somayajulu * Scsi Drv CMDQ struct 11611e25f0dSDavid C Somayajulu */ 11711e25f0dSDavid C Somayajulu struct scsi_drv_cmdq 11811e25f0dSDavid C Somayajulu { 11911e25f0dSDavid C Somayajulu __le16 cmdq_cons /* CMDQ consumer - updated by driver when CMDQ is consumed */; 12011e25f0dSDavid C Somayajulu __le16 reserved0; 12111e25f0dSDavid C Somayajulu __le32 reserved1; 12211e25f0dSDavid C Somayajulu }; 12311e25f0dSDavid C Somayajulu 12411e25f0dSDavid C Somayajulu /* 12511e25f0dSDavid C Somayajulu * Common SCSI init params passed by driver to FW in function init ramrod 12611e25f0dSDavid C Somayajulu */ 12711e25f0dSDavid C Somayajulu struct scsi_init_func_params 12811e25f0dSDavid C Somayajulu { 12911e25f0dSDavid C Somayajulu __le16 num_tasks /* Number of tasks in global task list */; 13011e25f0dSDavid C Somayajulu u8 log_page_size /* log of page size value */; 13111e25f0dSDavid C Somayajulu u8 debug_mode /* Use iscsi_debug_mode enum */; 13211e25f0dSDavid C Somayajulu u8 reserved2[12]; 13311e25f0dSDavid C Somayajulu }; 13411e25f0dSDavid C Somayajulu 13511e25f0dSDavid C Somayajulu /* 13611e25f0dSDavid C Somayajulu * SCSI RQ/CQ/CMDQ firmware function init parameters 13711e25f0dSDavid C Somayajulu */ 13811e25f0dSDavid C Somayajulu struct scsi_init_func_queues 13911e25f0dSDavid C Somayajulu { 14011e25f0dSDavid C Somayajulu struct regpair glbl_q_params_addr /* Global Qs (CQ/RQ/CMDQ) params host address */; 14111e25f0dSDavid C Somayajulu __le16 rq_buffer_size /* The buffer size of RQ BDQ */; 14211e25f0dSDavid C Somayajulu __le16 cq_num_entries /* CQ num entries */; 14311e25f0dSDavid C Somayajulu __le16 cmdq_num_entries /* CMDQ num entries */; 14411e25f0dSDavid C Somayajulu u8 bdq_resource_id /* Each function-init Ramrod maps its funciton ID to a BDQ function ID, each BDQ function ID contains per-BDQ-ID BDQs */; 14511e25f0dSDavid C Somayajulu u8 q_validity; 14611e25f0dSDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_RQ_VALID_MASK 0x1 14711e25f0dSDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_RQ_VALID_SHIFT 0 14811e25f0dSDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_IMM_DATA_VALID_MASK 0x1 14911e25f0dSDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_IMM_DATA_VALID_SHIFT 1 15011e25f0dSDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_CMD_VALID_MASK 0x1 15111e25f0dSDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_CMD_VALID_SHIFT 2 1529efd0ba7SDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_TQ_VALID_MASK 0x1 1539efd0ba7SDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_TQ_VALID_SHIFT 3 154*217ec208SDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_SOC_EN_MASK 0x1 /* This bit is valid if TQ is enabled for this function, SOC option enabled/disabled */ 155*217ec208SDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_SOC_EN_SHIFT 4 156*217ec208SDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_SOC_NUM_OF_BLOCKS_LOG_MASK 0x7 /* Relevant for TQe SOC option - num of blocks in SGE - log */ 157*217ec208SDavid C Somayajulu #define SCSI_INIT_FUNC_QUEUES_SOC_NUM_OF_BLOCKS_LOG_SHIFT 5 158*217ec208SDavid C Somayajulu __le16 cq_cmdq_sb_num_arr[SCSI_MAX_NUM_OF_CMDQS] /* CQ/CMDQ status block number array */; 15911e25f0dSDavid C Somayajulu u8 num_queues /* Number of continuous global queues used */; 16011e25f0dSDavid C Somayajulu u8 queue_relative_offset /* offset of continuous global queues used */; 16111e25f0dSDavid C Somayajulu u8 cq_sb_pi /* Protocol Index of CQ in status block (CQ consumer) */; 16211e25f0dSDavid C Somayajulu u8 cmdq_sb_pi /* Protocol Index of CMDQ in status block (CMDQ consumer) */; 16311e25f0dSDavid C Somayajulu u8 bdq_pbl_num_entries[BDQ_NUM_IDS] /* Per BDQ ID, the PBL page size (number of entries in PBL) */; 1649efd0ba7SDavid C Somayajulu u8 reserved1 /* reserved */; 16511e25f0dSDavid C Somayajulu struct regpair bdq_pbl_base_address[BDQ_NUM_IDS] /* Per BDQ ID, the PBL page Base Address */; 16611e25f0dSDavid C Somayajulu __le16 bdq_xoff_threshold[BDQ_NUM_IDS] /* BDQ XOFF threshold - when number of entries will be below that TH, it will send XOFF */; 16711e25f0dSDavid C Somayajulu __le16 cmdq_xoff_threshold /* CMDQ XOFF threshold - when number of entries will be below that TH, it will send XOFF */; 1689efd0ba7SDavid C Somayajulu __le16 bdq_xon_threshold[BDQ_NUM_IDS] /* BDQ XON threshold - when number of entries will be above that TH, it will send XON */; 16911e25f0dSDavid C Somayajulu __le16 cmdq_xon_threshold /* CMDQ XON threshold - when number of entries will be above that TH, it will send XON */; 17011e25f0dSDavid C Somayajulu }; 17111e25f0dSDavid C Somayajulu 17211e25f0dSDavid C Somayajulu /* 17311e25f0dSDavid C Somayajulu * Scsi Drv BDQ Data struct (2 BDQ IDs: 0 - RQ, 1 - Immediate Data) 17411e25f0dSDavid C Somayajulu */ 17511e25f0dSDavid C Somayajulu struct scsi_ram_per_bdq_resource_drv_data 17611e25f0dSDavid C Somayajulu { 17711e25f0dSDavid C Somayajulu struct scsi_bdq_ram_drv_data drv_data_per_bdq_id[BDQ_NUM_IDS] /* External ring data */; 17811e25f0dSDavid C Somayajulu }; 17911e25f0dSDavid C Somayajulu 18011e25f0dSDavid C Somayajulu /* 18111e25f0dSDavid C Somayajulu * SCSI SGL types 18211e25f0dSDavid C Somayajulu */ 18311e25f0dSDavid C Somayajulu enum scsi_sgl_mode 18411e25f0dSDavid C Somayajulu { 18511e25f0dSDavid C Somayajulu SCSI_TX_SLOW_SGL /* Slow-SGL: More than SCSI_NUM_SGES_SLOW_SGL_THR SGEs and there is at least 1 middle SGE than is smaller than a page size. May be only at TX */, 18611e25f0dSDavid C Somayajulu SCSI_FAST_SGL /* Fast SGL: Less than SCSI_NUM_SGES_SLOW_SGL_THR SGEs or all middle SGEs are at least a page size */, 18711e25f0dSDavid C Somayajulu MAX_SCSI_SGL_MODE 18811e25f0dSDavid C Somayajulu }; 18911e25f0dSDavid C Somayajulu 19011e25f0dSDavid C Somayajulu /* 19111e25f0dSDavid C Somayajulu * SCSI SGL parameters 19211e25f0dSDavid C Somayajulu */ 19311e25f0dSDavid C Somayajulu struct scsi_sgl_params 19411e25f0dSDavid C Somayajulu { 19511e25f0dSDavid C Somayajulu struct regpair sgl_addr /* SGL base address */; 19611e25f0dSDavid C Somayajulu __le32 sgl_total_length /* SGL total legnth (bytes) */; 19711e25f0dSDavid C Somayajulu __le32 sge_offset /* Offset in SGE (bytes) */; 19811e25f0dSDavid C Somayajulu __le16 sgl_num_sges /* Number of SGLs sges */; 19911e25f0dSDavid C Somayajulu u8 sgl_index /* SGL index */; 20011e25f0dSDavid C Somayajulu u8 reserved; 20111e25f0dSDavid C Somayajulu }; 20211e25f0dSDavid C Somayajulu 20311e25f0dSDavid C Somayajulu /* 20411e25f0dSDavid C Somayajulu * SCSI terminate connection params 20511e25f0dSDavid C Somayajulu */ 20611e25f0dSDavid C Somayajulu struct scsi_terminate_extra_params 20711e25f0dSDavid C Somayajulu { 20811e25f0dSDavid C Somayajulu __le16 unsolicited_cq_count /* Counts number of CQ placements done due to arrival of unsolicited packets on this connection */; 20911e25f0dSDavid C Somayajulu __le16 cmdq_count /* Counts number of CMDQ placements on this connection */; 21011e25f0dSDavid C Somayajulu u8 reserved[4]; 21111e25f0dSDavid C Somayajulu }; 21211e25f0dSDavid C Somayajulu 2139efd0ba7SDavid C Somayajulu /* 2149efd0ba7SDavid C Somayajulu * SCSI Task Queue Element 2159efd0ba7SDavid C Somayajulu */ 2169efd0ba7SDavid C Somayajulu struct scsi_tqe 2179efd0ba7SDavid C Somayajulu { 2189efd0ba7SDavid C Somayajulu __le16 itid /* Physical Address of buffer */; 2199efd0ba7SDavid C Somayajulu }; 2209efd0ba7SDavid C Somayajulu 22111e25f0dSDavid C Somayajulu #endif /* __STORAGE_COMMON__ */ 222