1a3667aaeSNaresh Kumar Inna /* 2a3667aaeSNaresh Kumar Inna * This file is part of the Chelsio FCoE driver for Linux. 3a3667aaeSNaresh Kumar Inna * 4a3667aaeSNaresh Kumar Inna * Copyright (c) 2008-2012 Chelsio Communications, Inc. All rights reserved. 5a3667aaeSNaresh Kumar Inna * 6a3667aaeSNaresh Kumar Inna * This software is available to you under a choice of one of two 7a3667aaeSNaresh Kumar Inna * licenses. You may choose to be licensed under the terms of the GNU 8a3667aaeSNaresh Kumar Inna * General Public License (GPL) Version 2, available from the file 9a3667aaeSNaresh Kumar Inna * COPYING in the main directory of this source tree, or the 10a3667aaeSNaresh Kumar Inna * OpenIB.org BSD license below: 11a3667aaeSNaresh Kumar Inna * 12a3667aaeSNaresh Kumar Inna * Redistribution and use in source and binary forms, with or 13a3667aaeSNaresh Kumar Inna * without modification, are permitted provided that the following 14a3667aaeSNaresh Kumar Inna * conditions are met: 15a3667aaeSNaresh Kumar Inna * 16a3667aaeSNaresh Kumar Inna * - Redistributions of source code must retain the above 17a3667aaeSNaresh Kumar Inna * copyright notice, this list of conditions and the following 18a3667aaeSNaresh Kumar Inna * disclaimer. 19a3667aaeSNaresh Kumar Inna * 20a3667aaeSNaresh Kumar Inna * - Redistributions in binary form must reproduce the above 21a3667aaeSNaresh Kumar Inna * copyright notice, this list of conditions and the following 22a3667aaeSNaresh Kumar Inna * disclaimer in the documentation and/or other materials 23a3667aaeSNaresh Kumar Inna * provided with the distribution. 24a3667aaeSNaresh Kumar Inna * 25a3667aaeSNaresh Kumar Inna * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26a3667aaeSNaresh Kumar Inna * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27a3667aaeSNaresh Kumar Inna * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28a3667aaeSNaresh Kumar Inna * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29a3667aaeSNaresh Kumar Inna * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30a3667aaeSNaresh Kumar Inna * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31a3667aaeSNaresh Kumar Inna * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32a3667aaeSNaresh Kumar Inna * SOFTWARE. 33a3667aaeSNaresh Kumar Inna */ 34a3667aaeSNaresh Kumar Inna 35a3667aaeSNaresh Kumar Inna #ifndef __CSIO_WR_H__ 36a3667aaeSNaresh Kumar Inna #define __CSIO_WR_H__ 37a3667aaeSNaresh Kumar Inna 38a3667aaeSNaresh Kumar Inna #include <linux/cache.h> 39a3667aaeSNaresh Kumar Inna 40a3667aaeSNaresh Kumar Inna #include "csio_defs.h" 41a3667aaeSNaresh Kumar Inna #include "t4fw_api.h" 42a3667aaeSNaresh Kumar Inna #include "t4fw_api_stor.h" 43a3667aaeSNaresh Kumar Inna 44a3667aaeSNaresh Kumar Inna /* 45a3667aaeSNaresh Kumar Inna * SGE register field values. 46a3667aaeSNaresh Kumar Inna */ 47a3667aaeSNaresh Kumar Inna #define X_INGPCIEBOUNDARY_32B 0 48a3667aaeSNaresh Kumar Inna #define X_INGPCIEBOUNDARY_64B 1 49a3667aaeSNaresh Kumar Inna #define X_INGPCIEBOUNDARY_128B 2 50a3667aaeSNaresh Kumar Inna #define X_INGPCIEBOUNDARY_256B 3 51a3667aaeSNaresh Kumar Inna #define X_INGPCIEBOUNDARY_512B 4 52a3667aaeSNaresh Kumar Inna #define X_INGPCIEBOUNDARY_1024B 5 53a3667aaeSNaresh Kumar Inna #define X_INGPCIEBOUNDARY_2048B 6 54a3667aaeSNaresh Kumar Inna #define X_INGPCIEBOUNDARY_4096B 7 55a3667aaeSNaresh Kumar Inna 56a3667aaeSNaresh Kumar Inna /* GTS register */ 57a3667aaeSNaresh Kumar Inna #define X_TIMERREG_COUNTER0 0 58a3667aaeSNaresh Kumar Inna #define X_TIMERREG_COUNTER1 1 59a3667aaeSNaresh Kumar Inna #define X_TIMERREG_COUNTER2 2 60a3667aaeSNaresh Kumar Inna #define X_TIMERREG_COUNTER3 3 61a3667aaeSNaresh Kumar Inna #define X_TIMERREG_COUNTER4 4 62a3667aaeSNaresh Kumar Inna #define X_TIMERREG_COUNTER5 5 63a3667aaeSNaresh Kumar Inna #define X_TIMERREG_RESTART_COUNTER 6 64a3667aaeSNaresh Kumar Inna #define X_TIMERREG_UPDATE_CIDX 7 65a3667aaeSNaresh Kumar Inna 66a3667aaeSNaresh Kumar Inna /* 67a3667aaeSNaresh Kumar Inna * Egress Context field values 68a3667aaeSNaresh Kumar Inna */ 69a3667aaeSNaresh Kumar Inna #define X_FETCHBURSTMIN_16B 0 70a3667aaeSNaresh Kumar Inna #define X_FETCHBURSTMIN_32B 1 71a3667aaeSNaresh Kumar Inna #define X_FETCHBURSTMIN_64B 2 72a3667aaeSNaresh Kumar Inna #define X_FETCHBURSTMIN_128B 3 73a3667aaeSNaresh Kumar Inna 74a3667aaeSNaresh Kumar Inna #define X_FETCHBURSTMAX_64B 0 75a3667aaeSNaresh Kumar Inna #define X_FETCHBURSTMAX_128B 1 76a3667aaeSNaresh Kumar Inna #define X_FETCHBURSTMAX_256B 2 77a3667aaeSNaresh Kumar Inna #define X_FETCHBURSTMAX_512B 3 78a3667aaeSNaresh Kumar Inna 79a3667aaeSNaresh Kumar Inna #define X_HOSTFCMODE_NONE 0 80a3667aaeSNaresh Kumar Inna #define X_HOSTFCMODE_INGRESS_QUEUE 1 81a3667aaeSNaresh Kumar Inna #define X_HOSTFCMODE_STATUS_PAGE 2 82a3667aaeSNaresh Kumar Inna #define X_HOSTFCMODE_BOTH 3 83a3667aaeSNaresh Kumar Inna 84a3667aaeSNaresh Kumar Inna /* 85a3667aaeSNaresh Kumar Inna * Ingress Context field values 86a3667aaeSNaresh Kumar Inna */ 87a3667aaeSNaresh Kumar Inna #define X_UPDATESCHEDULING_TIMER 0 88a3667aaeSNaresh Kumar Inna #define X_UPDATESCHEDULING_COUNTER_OPTTIMER 1 89a3667aaeSNaresh Kumar Inna 90a3667aaeSNaresh Kumar Inna #define X_UPDATEDELIVERY_NONE 0 91a3667aaeSNaresh Kumar Inna #define X_UPDATEDELIVERY_INTERRUPT 1 92a3667aaeSNaresh Kumar Inna #define X_UPDATEDELIVERY_STATUS_PAGE 2 93a3667aaeSNaresh Kumar Inna #define X_UPDATEDELIVERY_BOTH 3 94a3667aaeSNaresh Kumar Inna 95a3667aaeSNaresh Kumar Inna #define X_INTERRUPTDESTINATION_PCIE 0 96a3667aaeSNaresh Kumar Inna #define X_INTERRUPTDESTINATION_IQ 1 97a3667aaeSNaresh Kumar Inna 98a3667aaeSNaresh Kumar Inna #define X_RSPD_TYPE_FLBUF 0 99a3667aaeSNaresh Kumar Inna #define X_RSPD_TYPE_CPL 1 100a3667aaeSNaresh Kumar Inna #define X_RSPD_TYPE_INTR 2 101a3667aaeSNaresh Kumar Inna 102a3667aaeSNaresh Kumar Inna /* WR status is at the same position as retval in a CMD header */ 103a3667aaeSNaresh Kumar Inna #define csio_wr_status(_wr) \ 104*e2ac9628SHariprasad Shenai (FW_CMD_RETVAL_G(ntohl(((struct fw_cmd_hdr *)(_wr))->lo))) 105a3667aaeSNaresh Kumar Inna 106a3667aaeSNaresh Kumar Inna struct csio_hw; 107a3667aaeSNaresh Kumar Inna 108a3667aaeSNaresh Kumar Inna extern int csio_intr_coalesce_cnt; 109a3667aaeSNaresh Kumar Inna extern int csio_intr_coalesce_time; 110a3667aaeSNaresh Kumar Inna 111a3667aaeSNaresh Kumar Inna /* Ingress queue params */ 112a3667aaeSNaresh Kumar Inna struct csio_iq_params { 113a3667aaeSNaresh Kumar Inna 114a3667aaeSNaresh Kumar Inna uint8_t iq_start:1; 115a3667aaeSNaresh Kumar Inna uint8_t iq_stop:1; 116a3667aaeSNaresh Kumar Inna uint8_t pfn:3; 117a3667aaeSNaresh Kumar Inna 118a3667aaeSNaresh Kumar Inna uint8_t vfn; 119a3667aaeSNaresh Kumar Inna 120a3667aaeSNaresh Kumar Inna uint16_t physiqid; 121a3667aaeSNaresh Kumar Inna uint16_t iqid; 122a3667aaeSNaresh Kumar Inna 123a3667aaeSNaresh Kumar Inna uint16_t fl0id; 124a3667aaeSNaresh Kumar Inna uint16_t fl1id; 125a3667aaeSNaresh Kumar Inna 126a3667aaeSNaresh Kumar Inna uint8_t viid; 127a3667aaeSNaresh Kumar Inna 128a3667aaeSNaresh Kumar Inna uint8_t type; 129a3667aaeSNaresh Kumar Inna uint8_t iqasynch; 130a3667aaeSNaresh Kumar Inna uint8_t reserved4; 131a3667aaeSNaresh Kumar Inna 132a3667aaeSNaresh Kumar Inna uint8_t iqandst; 133a3667aaeSNaresh Kumar Inna uint8_t iqanus; 134a3667aaeSNaresh Kumar Inna uint8_t iqanud; 135a3667aaeSNaresh Kumar Inna 136a3667aaeSNaresh Kumar Inna uint16_t iqandstindex; 137a3667aaeSNaresh Kumar Inna 138a3667aaeSNaresh Kumar Inna uint8_t iqdroprss; 139a3667aaeSNaresh Kumar Inna uint8_t iqpciech; 140a3667aaeSNaresh Kumar Inna uint8_t iqdcaen; 141a3667aaeSNaresh Kumar Inna 142a3667aaeSNaresh Kumar Inna uint8_t iqdcacpu; 143a3667aaeSNaresh Kumar Inna uint8_t iqintcntthresh; 144a3667aaeSNaresh Kumar Inna uint8_t iqo; 145a3667aaeSNaresh Kumar Inna 146a3667aaeSNaresh Kumar Inna uint8_t iqcprio; 147a3667aaeSNaresh Kumar Inna uint8_t iqesize; 148a3667aaeSNaresh Kumar Inna 149a3667aaeSNaresh Kumar Inna uint16_t iqsize; 150a3667aaeSNaresh Kumar Inna 151a3667aaeSNaresh Kumar Inna uint64_t iqaddr; 152a3667aaeSNaresh Kumar Inna 153a3667aaeSNaresh Kumar Inna uint8_t iqflintiqhsen; 154a3667aaeSNaresh Kumar Inna uint8_t reserved5; 155a3667aaeSNaresh Kumar Inna uint8_t iqflintcongen; 156a3667aaeSNaresh Kumar Inna uint8_t iqflintcngchmap; 157a3667aaeSNaresh Kumar Inna 158a3667aaeSNaresh Kumar Inna uint32_t reserved6; 159a3667aaeSNaresh Kumar Inna 160a3667aaeSNaresh Kumar Inna uint8_t fl0hostfcmode; 161a3667aaeSNaresh Kumar Inna uint8_t fl0cprio; 162a3667aaeSNaresh Kumar Inna uint8_t fl0paden; 163a3667aaeSNaresh Kumar Inna uint8_t fl0packen; 164a3667aaeSNaresh Kumar Inna uint8_t fl0congen; 165a3667aaeSNaresh Kumar Inna uint8_t fl0dcaen; 166a3667aaeSNaresh Kumar Inna 167a3667aaeSNaresh Kumar Inna uint8_t fl0dcacpu; 168a3667aaeSNaresh Kumar Inna uint8_t fl0fbmin; 169a3667aaeSNaresh Kumar Inna 170a3667aaeSNaresh Kumar Inna uint8_t fl0fbmax; 171a3667aaeSNaresh Kumar Inna uint8_t fl0cidxfthresho; 172a3667aaeSNaresh Kumar Inna uint8_t fl0cidxfthresh; 173a3667aaeSNaresh Kumar Inna 174a3667aaeSNaresh Kumar Inna uint16_t fl0size; 175a3667aaeSNaresh Kumar Inna 176a3667aaeSNaresh Kumar Inna uint64_t fl0addr; 177a3667aaeSNaresh Kumar Inna 178a3667aaeSNaresh Kumar Inna uint64_t reserved7; 179a3667aaeSNaresh Kumar Inna 180a3667aaeSNaresh Kumar Inna uint8_t fl1hostfcmode; 181a3667aaeSNaresh Kumar Inna uint8_t fl1cprio; 182a3667aaeSNaresh Kumar Inna uint8_t fl1paden; 183a3667aaeSNaresh Kumar Inna uint8_t fl1packen; 184a3667aaeSNaresh Kumar Inna uint8_t fl1congen; 185a3667aaeSNaresh Kumar Inna uint8_t fl1dcaen; 186a3667aaeSNaresh Kumar Inna 187a3667aaeSNaresh Kumar Inna uint8_t fl1dcacpu; 188a3667aaeSNaresh Kumar Inna uint8_t fl1fbmin; 189a3667aaeSNaresh Kumar Inna 190a3667aaeSNaresh Kumar Inna uint8_t fl1fbmax; 191a3667aaeSNaresh Kumar Inna uint8_t fl1cidxfthresho; 192a3667aaeSNaresh Kumar Inna uint8_t fl1cidxfthresh; 193a3667aaeSNaresh Kumar Inna 194a3667aaeSNaresh Kumar Inna uint16_t fl1size; 195a3667aaeSNaresh Kumar Inna 196a3667aaeSNaresh Kumar Inna uint64_t fl1addr; 197a3667aaeSNaresh Kumar Inna }; 198a3667aaeSNaresh Kumar Inna 199a3667aaeSNaresh Kumar Inna /* Egress queue params */ 200a3667aaeSNaresh Kumar Inna struct csio_eq_params { 201a3667aaeSNaresh Kumar Inna 202a3667aaeSNaresh Kumar Inna uint8_t pfn; 203a3667aaeSNaresh Kumar Inna uint8_t vfn; 204a3667aaeSNaresh Kumar Inna 205a3667aaeSNaresh Kumar Inna uint8_t eqstart:1; 206a3667aaeSNaresh Kumar Inna uint8_t eqstop:1; 207a3667aaeSNaresh Kumar Inna 208a3667aaeSNaresh Kumar Inna uint16_t physeqid; 209a3667aaeSNaresh Kumar Inna uint32_t eqid; 210a3667aaeSNaresh Kumar Inna 211a3667aaeSNaresh Kumar Inna uint8_t hostfcmode:2; 212a3667aaeSNaresh Kumar Inna uint8_t cprio:1; 213a3667aaeSNaresh Kumar Inna uint8_t pciechn:3; 214a3667aaeSNaresh Kumar Inna 215a3667aaeSNaresh Kumar Inna uint16_t iqid; 216a3667aaeSNaresh Kumar Inna 217a3667aaeSNaresh Kumar Inna uint8_t dcaen:1; 218a3667aaeSNaresh Kumar Inna uint8_t dcacpu:5; 219a3667aaeSNaresh Kumar Inna 220a3667aaeSNaresh Kumar Inna uint8_t fbmin:3; 221a3667aaeSNaresh Kumar Inna uint8_t fbmax:3; 222a3667aaeSNaresh Kumar Inna 223a3667aaeSNaresh Kumar Inna uint8_t cidxfthresho:1; 224a3667aaeSNaresh Kumar Inna uint8_t cidxfthresh:3; 225a3667aaeSNaresh Kumar Inna 226a3667aaeSNaresh Kumar Inna uint16_t eqsize; 227a3667aaeSNaresh Kumar Inna 228a3667aaeSNaresh Kumar Inna uint64_t eqaddr; 229a3667aaeSNaresh Kumar Inna }; 230a3667aaeSNaresh Kumar Inna 231a3667aaeSNaresh Kumar Inna struct csio_dma_buf { 232a3667aaeSNaresh Kumar Inna struct list_head list; 233a3667aaeSNaresh Kumar Inna void *vaddr; /* Virtual address */ 234a3667aaeSNaresh Kumar Inna dma_addr_t paddr; /* Physical address */ 235a3667aaeSNaresh Kumar Inna uint32_t len; /* Buffer size */ 236a3667aaeSNaresh Kumar Inna }; 237a3667aaeSNaresh Kumar Inna 238a3667aaeSNaresh Kumar Inna /* Generic I/O request structure */ 239a3667aaeSNaresh Kumar Inna struct csio_ioreq { 240a3667aaeSNaresh Kumar Inna struct csio_sm sm; /* SM, List 241a3667aaeSNaresh Kumar Inna * should be the first member 242a3667aaeSNaresh Kumar Inna */ 243a3667aaeSNaresh Kumar Inna int iq_idx; /* Ingress queue index */ 244a3667aaeSNaresh Kumar Inna int eq_idx; /* Egress queue index */ 245a3667aaeSNaresh Kumar Inna uint32_t nsge; /* Number of SG elements */ 246a3667aaeSNaresh Kumar Inna uint32_t tmo; /* Driver timeout */ 247a3667aaeSNaresh Kumar Inna uint32_t datadir; /* Data direction */ 248a3667aaeSNaresh Kumar Inna struct csio_dma_buf dma_buf; /* Req/resp DMA buffers */ 249a3667aaeSNaresh Kumar Inna uint16_t wr_status; /* WR completion status */ 250a3667aaeSNaresh Kumar Inna int16_t drv_status; /* Driver internal status */ 251a3667aaeSNaresh Kumar Inna struct csio_lnode *lnode; /* Owner lnode */ 252a3667aaeSNaresh Kumar Inna struct csio_rnode *rnode; /* Src/destination rnode */ 253a3667aaeSNaresh Kumar Inna void (*io_cbfn) (struct csio_hw *, struct csio_ioreq *); 254a3667aaeSNaresh Kumar Inna /* completion callback */ 255a3667aaeSNaresh Kumar Inna void *scratch1; /* Scratch area 1. 256a3667aaeSNaresh Kumar Inna */ 257a3667aaeSNaresh Kumar Inna void *scratch2; /* Scratch area 2. */ 258a3667aaeSNaresh Kumar Inna struct list_head gen_list; /* Any list associated with 259a3667aaeSNaresh Kumar Inna * this ioreq. 260a3667aaeSNaresh Kumar Inna */ 261a3667aaeSNaresh Kumar Inna uint64_t fw_handle; /* Unique handle passed 262a3667aaeSNaresh Kumar Inna * to FW 263a3667aaeSNaresh Kumar Inna */ 264a3667aaeSNaresh Kumar Inna uint8_t dcopy; /* Data copy required */ 265a3667aaeSNaresh Kumar Inna uint8_t reserved1; 266a3667aaeSNaresh Kumar Inna uint16_t reserved2; 267a3667aaeSNaresh Kumar Inna struct completion cmplobj; /* ioreq completion object */ 268a3667aaeSNaresh Kumar Inna } ____cacheline_aligned_in_smp; 269a3667aaeSNaresh Kumar Inna 270a3667aaeSNaresh Kumar Inna /* 271a3667aaeSNaresh Kumar Inna * Egress status page for egress cidx updates 272a3667aaeSNaresh Kumar Inna */ 273a3667aaeSNaresh Kumar Inna struct csio_qstatus_page { 274a3667aaeSNaresh Kumar Inna __be32 qid; 275a3667aaeSNaresh Kumar Inna __be16 cidx; 276a3667aaeSNaresh Kumar Inna __be16 pidx; 277a3667aaeSNaresh Kumar Inna }; 278a3667aaeSNaresh Kumar Inna 279a3667aaeSNaresh Kumar Inna 280a3667aaeSNaresh Kumar Inna enum { 281a3667aaeSNaresh Kumar Inna CSIO_MAX_FLBUF_PER_IQWR = 4, 282a3667aaeSNaresh Kumar Inna CSIO_QCREDIT_SZ = 64, /* pidx/cidx increments 283a3667aaeSNaresh Kumar Inna * in bytes 284a3667aaeSNaresh Kumar Inna */ 285a3667aaeSNaresh Kumar Inna CSIO_MAX_QID = 0xFFFF, 286a3667aaeSNaresh Kumar Inna CSIO_MAX_IQ = 128, 287a3667aaeSNaresh Kumar Inna 288a3667aaeSNaresh Kumar Inna CSIO_SGE_NTIMERS = 6, 289a3667aaeSNaresh Kumar Inna CSIO_SGE_NCOUNTERS = 4, 290a3667aaeSNaresh Kumar Inna CSIO_SGE_FL_SIZE_REGS = 16, 291a3667aaeSNaresh Kumar Inna }; 292a3667aaeSNaresh Kumar Inna 293a3667aaeSNaresh Kumar Inna /* Defines for type */ 294a3667aaeSNaresh Kumar Inna enum { 295a3667aaeSNaresh Kumar Inna CSIO_EGRESS = 1, 296a3667aaeSNaresh Kumar Inna CSIO_INGRESS = 2, 297a3667aaeSNaresh Kumar Inna CSIO_FREELIST = 3, 298a3667aaeSNaresh Kumar Inna }; 299a3667aaeSNaresh Kumar Inna 300a3667aaeSNaresh Kumar Inna /* 301a3667aaeSNaresh Kumar Inna * Structure for footer (last 2 flits) of Ingress Queue Entry. 302a3667aaeSNaresh Kumar Inna */ 303a3667aaeSNaresh Kumar Inna struct csio_iqwr_footer { 304a3667aaeSNaresh Kumar Inna __be32 hdrbuflen_pidx; 305a3667aaeSNaresh Kumar Inna __be32 pldbuflen_qid; 306a3667aaeSNaresh Kumar Inna union { 307a3667aaeSNaresh Kumar Inna u8 type_gen; 308a3667aaeSNaresh Kumar Inna __be64 last_flit; 309a3667aaeSNaresh Kumar Inna } u; 310a3667aaeSNaresh Kumar Inna }; 311a3667aaeSNaresh Kumar Inna 312a3667aaeSNaresh Kumar Inna #define IQWRF_NEWBUF (1 << 31) 313a3667aaeSNaresh Kumar Inna #define IQWRF_LEN_GET(x) (((x) >> 0) & 0x7fffffffU) 314a3667aaeSNaresh Kumar Inna #define IQWRF_GEN_SHIFT 7 315a3667aaeSNaresh Kumar Inna #define IQWRF_TYPE_GET(x) (((x) >> 4) & 0x3U) 316a3667aaeSNaresh Kumar Inna 317a3667aaeSNaresh Kumar Inna 318a3667aaeSNaresh Kumar Inna /* 319a3667aaeSNaresh Kumar Inna * WR pair: 320a3667aaeSNaresh Kumar Inna * ======== 321a3667aaeSNaresh Kumar Inna * A WR can start towards the end of a queue, and then continue at the 322a3667aaeSNaresh Kumar Inna * beginning, since the queue is considered to be circular. This will 323a3667aaeSNaresh Kumar Inna * require a pair of address/len to be passed back to the caller - 324a3667aaeSNaresh Kumar Inna * hence the Work request pair structure. 325a3667aaeSNaresh Kumar Inna */ 326a3667aaeSNaresh Kumar Inna struct csio_wr_pair { 327a3667aaeSNaresh Kumar Inna void *addr1; 328a3667aaeSNaresh Kumar Inna uint32_t size1; 329a3667aaeSNaresh Kumar Inna void *addr2; 330a3667aaeSNaresh Kumar Inna uint32_t size2; 331a3667aaeSNaresh Kumar Inna }; 332a3667aaeSNaresh Kumar Inna 333a3667aaeSNaresh Kumar Inna /* 334a3667aaeSNaresh Kumar Inna * The following structure is used by ingress processing to return the 335a3667aaeSNaresh Kumar Inna * free list buffers to consumers. 336a3667aaeSNaresh Kumar Inna */ 337a3667aaeSNaresh Kumar Inna struct csio_fl_dma_buf { 338a3667aaeSNaresh Kumar Inna struct csio_dma_buf flbufs[CSIO_MAX_FLBUF_PER_IQWR]; 339a3667aaeSNaresh Kumar Inna /* Freelist DMA buffers */ 340a3667aaeSNaresh Kumar Inna int offset; /* Offset within the 341a3667aaeSNaresh Kumar Inna * first FL buf. 342a3667aaeSNaresh Kumar Inna */ 343a3667aaeSNaresh Kumar Inna uint32_t totlen; /* Total length */ 344a3667aaeSNaresh Kumar Inna uint8_t defer_free; /* Free of buffer can 345a3667aaeSNaresh Kumar Inna * deferred 346a3667aaeSNaresh Kumar Inna */ 347a3667aaeSNaresh Kumar Inna }; 348a3667aaeSNaresh Kumar Inna 349a3667aaeSNaresh Kumar Inna /* Data-types */ 350a3667aaeSNaresh Kumar Inna typedef void (*iq_handler_t)(struct csio_hw *, void *, uint32_t, 351a3667aaeSNaresh Kumar Inna struct csio_fl_dma_buf *, void *); 352a3667aaeSNaresh Kumar Inna 353a3667aaeSNaresh Kumar Inna struct csio_iq { 354a3667aaeSNaresh Kumar Inna uint16_t iqid; /* Queue ID */ 355a3667aaeSNaresh Kumar Inna uint16_t physiqid; /* Physical Queue ID */ 356a3667aaeSNaresh Kumar Inna uint16_t genbit; /* Generation bit, 357a3667aaeSNaresh Kumar Inna * initially set to 1 358a3667aaeSNaresh Kumar Inna */ 359a3667aaeSNaresh Kumar Inna int flq_idx; /* Freelist queue index */ 360a3667aaeSNaresh Kumar Inna iq_handler_t iq_intx_handler; /* IQ INTx handler routine */ 361a3667aaeSNaresh Kumar Inna }; 362a3667aaeSNaresh Kumar Inna 363a3667aaeSNaresh Kumar Inna struct csio_eq { 364a3667aaeSNaresh Kumar Inna uint16_t eqid; /* Qid */ 365a3667aaeSNaresh Kumar Inna uint16_t physeqid; /* Physical Queue ID */ 366a3667aaeSNaresh Kumar Inna uint8_t wrap[512]; /* Temp area for q-wrap around*/ 367a3667aaeSNaresh Kumar Inna }; 368a3667aaeSNaresh Kumar Inna 369a3667aaeSNaresh Kumar Inna struct csio_fl { 370a3667aaeSNaresh Kumar Inna uint16_t flid; /* Qid */ 371a3667aaeSNaresh Kumar Inna uint16_t packen; /* Packing enabled? */ 372a3667aaeSNaresh Kumar Inna int offset; /* Offset within FL buf */ 373a3667aaeSNaresh Kumar Inna int sreg; /* Size register */ 374a3667aaeSNaresh Kumar Inna struct csio_dma_buf *bufs; /* Free list buffer ptr array 375a3667aaeSNaresh Kumar Inna * indexed using flq->cidx/pidx 376a3667aaeSNaresh Kumar Inna */ 377a3667aaeSNaresh Kumar Inna }; 378a3667aaeSNaresh Kumar Inna 379a3667aaeSNaresh Kumar Inna struct csio_qstats { 380a3667aaeSNaresh Kumar Inna uint32_t n_tot_reqs; /* Total no. of Requests */ 381a3667aaeSNaresh Kumar Inna uint32_t n_tot_rsps; /* Total no. of responses */ 382a3667aaeSNaresh Kumar Inna uint32_t n_qwrap; /* Queue wraps */ 383a3667aaeSNaresh Kumar Inna uint32_t n_eq_wr_split; /* Number of split EQ WRs */ 384a3667aaeSNaresh Kumar Inna uint32_t n_qentry; /* Queue entry */ 385a3667aaeSNaresh Kumar Inna uint32_t n_qempty; /* Queue empty */ 386a3667aaeSNaresh Kumar Inna uint32_t n_qfull; /* Queue fulls */ 387a3667aaeSNaresh Kumar Inna uint32_t n_rsp_unknown; /* Unknown response type */ 388a3667aaeSNaresh Kumar Inna uint32_t n_stray_comp; /* Stray completion intr */ 389a3667aaeSNaresh Kumar Inna uint32_t n_flq_refill; /* Number of FL refills */ 390a3667aaeSNaresh Kumar Inna }; 391a3667aaeSNaresh Kumar Inna 392a3667aaeSNaresh Kumar Inna /* Queue metadata */ 393a3667aaeSNaresh Kumar Inna struct csio_q { 394a3667aaeSNaresh Kumar Inna uint16_t type; /* Type: Ingress/Egress/FL */ 395a3667aaeSNaresh Kumar Inna uint16_t pidx; /* producer index */ 396a3667aaeSNaresh Kumar Inna uint16_t cidx; /* consumer index */ 397a3667aaeSNaresh Kumar Inna uint16_t inc_idx; /* Incremental index */ 398a3667aaeSNaresh Kumar Inna uint32_t wr_sz; /* Size of all WRs in this q 399a3667aaeSNaresh Kumar Inna * if fixed 400a3667aaeSNaresh Kumar Inna */ 401a3667aaeSNaresh Kumar Inna void *vstart; /* Base virtual address 402a3667aaeSNaresh Kumar Inna * of queue 403a3667aaeSNaresh Kumar Inna */ 404a3667aaeSNaresh Kumar Inna void *vwrap; /* Virtual end address to 405a3667aaeSNaresh Kumar Inna * wrap around at 406a3667aaeSNaresh Kumar Inna */ 407a3667aaeSNaresh Kumar Inna uint32_t credits; /* Size of queue in credits */ 408a3667aaeSNaresh Kumar Inna void *owner; /* Owner */ 409a3667aaeSNaresh Kumar Inna union { /* Queue contexts */ 410a3667aaeSNaresh Kumar Inna struct csio_iq iq; 411a3667aaeSNaresh Kumar Inna struct csio_eq eq; 412a3667aaeSNaresh Kumar Inna struct csio_fl fl; 413a3667aaeSNaresh Kumar Inna } un; 414a3667aaeSNaresh Kumar Inna 415a3667aaeSNaresh Kumar Inna dma_addr_t pstart; /* Base physical address of 416a3667aaeSNaresh Kumar Inna * queue 417a3667aaeSNaresh Kumar Inna */ 418a3667aaeSNaresh Kumar Inna uint32_t portid; /* PCIE Channel */ 419a3667aaeSNaresh Kumar Inna uint32_t size; /* Size of queue in bytes */ 420a3667aaeSNaresh Kumar Inna struct csio_qstats stats; /* Statistics */ 421a3667aaeSNaresh Kumar Inna } ____cacheline_aligned_in_smp; 422a3667aaeSNaresh Kumar Inna 423a3667aaeSNaresh Kumar Inna struct csio_sge { 424a3667aaeSNaresh Kumar Inna uint32_t csio_fl_align; /* Calculated and cached 425a3667aaeSNaresh Kumar Inna * for fast path 426a3667aaeSNaresh Kumar Inna */ 427a3667aaeSNaresh Kumar Inna uint32_t sge_control; /* padding, boundaries, 428a3667aaeSNaresh Kumar Inna * lengths, etc. 429a3667aaeSNaresh Kumar Inna */ 430a3667aaeSNaresh Kumar Inna uint32_t sge_host_page_size; /* Host page size */ 431a3667aaeSNaresh Kumar Inna uint32_t sge_fl_buf_size[CSIO_SGE_FL_SIZE_REGS]; 432a3667aaeSNaresh Kumar Inna /* free list buffer sizes */ 433a3667aaeSNaresh Kumar Inna uint16_t timer_val[CSIO_SGE_NTIMERS]; 434a3667aaeSNaresh Kumar Inna uint8_t counter_val[CSIO_SGE_NCOUNTERS]; 435a3667aaeSNaresh Kumar Inna }; 436a3667aaeSNaresh Kumar Inna 437a3667aaeSNaresh Kumar Inna /* Work request module */ 438a3667aaeSNaresh Kumar Inna struct csio_wrm { 439a3667aaeSNaresh Kumar Inna int num_q; /* Number of queues */ 440a3667aaeSNaresh Kumar Inna struct csio_q **q_arr; /* Array of queue pointers 441a3667aaeSNaresh Kumar Inna * allocated dynamically 442a3667aaeSNaresh Kumar Inna * based on configured values 443a3667aaeSNaresh Kumar Inna */ 444a3667aaeSNaresh Kumar Inna uint32_t fw_iq_start; /* Start ID of IQ for this fn*/ 445a3667aaeSNaresh Kumar Inna uint32_t fw_eq_start; /* Start ID of EQ for this fn*/ 446a3667aaeSNaresh Kumar Inna struct csio_q *intr_map[CSIO_MAX_IQ]; 447a3667aaeSNaresh Kumar Inna /* IQ-id to IQ map table. */ 448a3667aaeSNaresh Kumar Inna int free_qidx; /* queue idx of free queue */ 449a3667aaeSNaresh Kumar Inna struct csio_sge sge; /* SGE params */ 450a3667aaeSNaresh Kumar Inna }; 451a3667aaeSNaresh Kumar Inna 452a3667aaeSNaresh Kumar Inna #define csio_get_q(__hw, __idx) ((__hw)->wrm.q_arr[__idx]) 453a3667aaeSNaresh Kumar Inna #define csio_q_type(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->type) 454a3667aaeSNaresh Kumar Inna #define csio_q_pidx(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->pidx) 455a3667aaeSNaresh Kumar Inna #define csio_q_cidx(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->cidx) 456a3667aaeSNaresh Kumar Inna #define csio_q_inc_idx(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->inc_idx) 457a3667aaeSNaresh Kumar Inna #define csio_q_vstart(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->vstart) 458a3667aaeSNaresh Kumar Inna #define csio_q_pstart(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->pstart) 459a3667aaeSNaresh Kumar Inna #define csio_q_size(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->size) 460a3667aaeSNaresh Kumar Inna #define csio_q_credits(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->credits) 461a3667aaeSNaresh Kumar Inna #define csio_q_portid(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->portid) 462a3667aaeSNaresh Kumar Inna #define csio_q_wr_sz(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->wr_sz) 463a3667aaeSNaresh Kumar Inna #define csio_q_iqid(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->un.iq.iqid) 464a3667aaeSNaresh Kumar Inna #define csio_q_physiqid(__hw, __idx) \ 465a3667aaeSNaresh Kumar Inna ((__hw)->wrm.q_arr[(__idx)]->un.iq.physiqid) 466a3667aaeSNaresh Kumar Inna #define csio_q_iq_flq_idx(__hw, __idx) \ 467a3667aaeSNaresh Kumar Inna ((__hw)->wrm.q_arr[(__idx)]->un.iq.flq_idx) 468a3667aaeSNaresh Kumar Inna #define csio_q_eqid(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->un.eq.eqid) 469a3667aaeSNaresh Kumar Inna #define csio_q_flid(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->un.fl.flid) 470a3667aaeSNaresh Kumar Inna 471a3667aaeSNaresh Kumar Inna #define csio_q_physeqid(__hw, __idx) \ 472a3667aaeSNaresh Kumar Inna ((__hw)->wrm.q_arr[(__idx)]->un.eq.physeqid) 473a3667aaeSNaresh Kumar Inna #define csio_iq_has_fl(__iq) ((__iq)->un.iq.flq_idx != -1) 474a3667aaeSNaresh Kumar Inna 475a3667aaeSNaresh Kumar Inna #define csio_q_iq_to_flid(__hw, __iq_idx) \ 476a3667aaeSNaresh Kumar Inna csio_q_flid((__hw), (__hw)->wrm.q_arr[(__iq_qidx)]->un.iq.flq_idx) 477a3667aaeSNaresh Kumar Inna #define csio_q_set_intr_map(__hw, __iq_idx, __rel_iq_id) \ 478a3667aaeSNaresh Kumar Inna (__hw)->wrm.intr_map[__rel_iq_id] = csio_get_q(__hw, __iq_idx) 479a3667aaeSNaresh Kumar Inna #define csio_q_eq_wrap(__hw, __idx) ((__hw)->wrm.q_arr[(__idx)]->un.eq.wrap) 480a3667aaeSNaresh Kumar Inna 481a3667aaeSNaresh Kumar Inna struct csio_mb; 482a3667aaeSNaresh Kumar Inna 483a3667aaeSNaresh Kumar Inna int csio_wr_alloc_q(struct csio_hw *, uint32_t, uint32_t, 484a3667aaeSNaresh Kumar Inna uint16_t, void *, uint32_t, int, iq_handler_t); 485a3667aaeSNaresh Kumar Inna int csio_wr_iq_create(struct csio_hw *, void *, int, 486a3667aaeSNaresh Kumar Inna uint32_t, uint8_t, bool, 487a3667aaeSNaresh Kumar Inna void (*)(struct csio_hw *, struct csio_mb *)); 488a3667aaeSNaresh Kumar Inna int csio_wr_eq_create(struct csio_hw *, void *, int, int, uint8_t, 489a3667aaeSNaresh Kumar Inna void (*)(struct csio_hw *, struct csio_mb *)); 490a3667aaeSNaresh Kumar Inna int csio_wr_destroy_queues(struct csio_hw *, bool cmd); 491a3667aaeSNaresh Kumar Inna 492a3667aaeSNaresh Kumar Inna 493a3667aaeSNaresh Kumar Inna int csio_wr_get(struct csio_hw *, int, uint32_t, 494a3667aaeSNaresh Kumar Inna struct csio_wr_pair *); 495a3667aaeSNaresh Kumar Inna void csio_wr_copy_to_wrp(void *, struct csio_wr_pair *, uint32_t, uint32_t); 496a3667aaeSNaresh Kumar Inna int csio_wr_issue(struct csio_hw *, int, bool); 497a3667aaeSNaresh Kumar Inna int csio_wr_process_iq(struct csio_hw *, struct csio_q *, 498a3667aaeSNaresh Kumar Inna void (*)(struct csio_hw *, void *, 499a3667aaeSNaresh Kumar Inna uint32_t, struct csio_fl_dma_buf *, 500a3667aaeSNaresh Kumar Inna void *), 501a3667aaeSNaresh Kumar Inna void *); 502a3667aaeSNaresh Kumar Inna int csio_wr_process_iq_idx(struct csio_hw *, int, 503a3667aaeSNaresh Kumar Inna void (*)(struct csio_hw *, void *, 504a3667aaeSNaresh Kumar Inna uint32_t, struct csio_fl_dma_buf *, 505a3667aaeSNaresh Kumar Inna void *), 506a3667aaeSNaresh Kumar Inna void *); 507a3667aaeSNaresh Kumar Inna 508a3667aaeSNaresh Kumar Inna void csio_wr_sge_init(struct csio_hw *); 509a3667aaeSNaresh Kumar Inna int csio_wrm_init(struct csio_wrm *, struct csio_hw *); 510a3667aaeSNaresh Kumar Inna void csio_wrm_exit(struct csio_wrm *, struct csio_hw *); 511a3667aaeSNaresh Kumar Inna 512a3667aaeSNaresh Kumar Inna #endif /* ifndef __CSIO_WR_H__ */ 513