linux/drivers/net/ethernet/qlogic/qed/qed_hw.h
<<
>>
Prefs
   1/* QLogic qed NIC Driver
   2 * Copyright (c) 2015-2017  QLogic Corporation
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and /or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 */
  32
  33#ifndef _QED_HW_H
  34#define _QED_HW_H
  35
  36#include <linux/types.h>
  37#include <linux/bitops.h>
  38#include <linux/slab.h>
  39#include <linux/string.h>
  40#include "qed.h"
  41#include "qed_dev_api.h"
  42
  43/* Forward decleration */
  44struct qed_ptt;
  45
  46enum reserved_ptts {
  47        RESERVED_PTT_EDIAG,
  48        RESERVED_PTT_USER_SPACE,
  49        RESERVED_PTT_MAIN,
  50        RESERVED_PTT_DPC,
  51        RESERVED_PTT_MAX
  52};
  53
  54enum _dmae_cmd_dst_mask {
  55        DMAE_CMD_DST_MASK_NONE  = 0,
  56        DMAE_CMD_DST_MASK_PCIE  = 1,
  57        DMAE_CMD_DST_MASK_GRC   = 2
  58};
  59
  60enum _dmae_cmd_src_mask {
  61        DMAE_CMD_SRC_MASK_PCIE  = 0,
  62        DMAE_CMD_SRC_MASK_GRC   = 1
  63};
  64
  65enum _dmae_cmd_crc_mask {
  66        DMAE_CMD_COMP_CRC_EN_MASK_NONE  = 0,
  67        DMAE_CMD_COMP_CRC_EN_MASK_SET   = 1
  68};
  69
  70/* definitions for DMA constants */
  71#define DMAE_GO_VALUE   0x1
  72
  73#define DMAE_COMPLETION_VAL     0xD1AE
  74#define DMAE_CMD_ENDIANITY      0x2
  75
  76#define DMAE_CMD_SIZE   14
  77#define DMAE_CMD_SIZE_TO_FILL   (DMAE_CMD_SIZE - 5)
  78#define DMAE_MIN_WAIT_TIME      0x2
  79#define DMAE_MAX_CLIENTS        32
  80
  81/**
  82 * @brief qed_gtt_init - Initialize GTT windows
  83 *
  84 * @param p_hwfn
  85 */
  86void qed_gtt_init(struct qed_hwfn *p_hwfn);
  87
  88/**
  89 * @brief qed_ptt_invalidate - Forces all ptt entries to be re-configured
  90 *
  91 * @param p_hwfn
  92 */
  93void qed_ptt_invalidate(struct qed_hwfn *p_hwfn);
  94
  95/**
  96 * @brief qed_ptt_pool_alloc - Allocate and initialize PTT pool
  97 *
  98 * @param p_hwfn
  99 *
 100 * @return struct _qed_status - success (0), negative - error.
 101 */
 102int qed_ptt_pool_alloc(struct qed_hwfn *p_hwfn);
 103
 104/**
 105 * @brief qed_ptt_pool_free -
 106 *
 107 * @param p_hwfn
 108 */
 109void qed_ptt_pool_free(struct qed_hwfn *p_hwfn);
 110
 111/**
 112 * @brief qed_ptt_get_hw_addr - Get PTT's GRC/HW address
 113 *
 114 * @param p_hwfn
 115 * @param p_ptt
 116 *
 117 * @return u32
 118 */
 119u32 qed_ptt_get_hw_addr(struct qed_hwfn *p_hwfn,
 120                        struct qed_ptt *p_ptt);
 121
 122/**
 123 * @brief qed_ptt_get_bar_addr - Get PPT's external BAR address
 124 *
 125 * @param p_hwfn
 126 * @param p_ptt
 127 *
 128 * @return u32
 129 */
 130u32 qed_ptt_get_bar_addr(struct qed_ptt *p_ptt);
 131
 132/**
 133 * @brief qed_ptt_set_win - Set PTT Window's GRC BAR address
 134 *
 135 * @param p_hwfn
 136 * @param new_hw_addr
 137 * @param p_ptt
 138 */
 139void qed_ptt_set_win(struct qed_hwfn *p_hwfn,
 140                     struct qed_ptt *p_ptt,
 141                     u32 new_hw_addr);
 142
 143/**
 144 * @brief qed_get_reserved_ptt - Get a specific reserved PTT
 145 *
 146 * @param p_hwfn
 147 * @param ptt_idx
 148 *
 149 * @return struct qed_ptt *
 150 */
 151struct qed_ptt *qed_get_reserved_ptt(struct qed_hwfn *p_hwfn,
 152                                     enum reserved_ptts ptt_idx);
 153
 154/**
 155 * @brief qed_wr - Write value to BAR using the given ptt
 156 *
 157 * @param p_hwfn
 158 * @param p_ptt
 159 * @param val
 160 * @param hw_addr
 161 */
 162void qed_wr(struct qed_hwfn *p_hwfn,
 163            struct qed_ptt *p_ptt,
 164            u32 hw_addr,
 165            u32 val);
 166
 167/**
 168 * @brief qed_rd - Read value from BAR using the given ptt
 169 *
 170 * @param p_hwfn
 171 * @param p_ptt
 172 * @param val
 173 * @param hw_addr
 174 */
 175u32 qed_rd(struct qed_hwfn *p_hwfn,
 176           struct qed_ptt *p_ptt,
 177           u32 hw_addr);
 178
 179/**
 180 * @brief qed_memcpy_from - copy n bytes from BAR using the given
 181 *        ptt
 182 *
 183 * @param p_hwfn
 184 * @param p_ptt
 185 * @param dest
 186 * @param hw_addr
 187 * @param n
 188 */
 189void qed_memcpy_from(struct qed_hwfn *p_hwfn,
 190                     struct qed_ptt *p_ptt,
 191                     void *dest,
 192                     u32 hw_addr,
 193                     size_t n);
 194
 195/**
 196 * @brief qed_memcpy_to - copy n bytes to BAR using the given
 197 *        ptt
 198 *
 199 * @param p_hwfn
 200 * @param p_ptt
 201 * @param hw_addr
 202 * @param src
 203 * @param n
 204 */
 205void qed_memcpy_to(struct qed_hwfn *p_hwfn,
 206                   struct qed_ptt *p_ptt,
 207                   u32 hw_addr,
 208                   void *src,
 209                   size_t n);
 210/**
 211 * @brief qed_fid_pretend - pretend to another function when
 212 *        accessing the ptt window. There is no way to unpretend
 213 *        a function. The only way to cancel a pretend is to
 214 *        pretend back to the original function.
 215 *
 216 * @param p_hwfn
 217 * @param p_ptt
 218 * @param fid - fid field of pxp_pretend structure. Can contain
 219 *            either pf / vf, port/path fields are don't care.
 220 */
 221void qed_fid_pretend(struct qed_hwfn *p_hwfn,
 222                     struct qed_ptt *p_ptt,
 223                     u16 fid);
 224
 225/**
 226 * @brief qed_port_pretend - pretend to another port when
 227 *        accessing the ptt window
 228 *
 229 * @param p_hwfn
 230 * @param p_ptt
 231 * @param port_id - the port to pretend to
 232 */
 233void qed_port_pretend(struct qed_hwfn *p_hwfn,
 234                      struct qed_ptt *p_ptt,
 235                      u8 port_id);
 236
 237/**
 238 * @brief qed_port_unpretend - cancel any previously set port
 239 *        pretend
 240 *
 241 * @param p_hwfn
 242 * @param p_ptt
 243 */
 244void qed_port_unpretend(struct qed_hwfn *p_hwfn,
 245                        struct qed_ptt *p_ptt);
 246
 247/**
 248 * @brief qed_port_fid_pretend - pretend to another port and another function
 249 *        when accessing the ptt window
 250 *
 251 * @param p_hwfn
 252 * @param p_ptt
 253 * @param port_id - the port to pretend to
 254 * @param fid - fid field of pxp_pretend structure. Can contain either pf / vf.
 255 */
 256void qed_port_fid_pretend(struct qed_hwfn *p_hwfn,
 257                          struct qed_ptt *p_ptt, u8 port_id, u16 fid);
 258
 259/**
 260 * @brief qed_vfid_to_concrete - build a concrete FID for a
 261 *        given VF ID
 262 *
 263 * @param p_hwfn
 264 * @param p_ptt
 265 * @param vfid
 266 */
 267u32 qed_vfid_to_concrete(struct qed_hwfn *p_hwfn, u8 vfid);
 268
 269/**
 270 * @brief qed_dmae_idx_to_go_cmd - map the idx to dmae cmd
 271 * this is declared here since other files will require it.
 272 * @param idx
 273 */
 274u32 qed_dmae_idx_to_go_cmd(u8 idx);
 275
 276/**
 277 * @brief qed_dmae_info_alloc - Init the dmae_info structure
 278 * which is part of p_hwfn.
 279 * @param p_hwfn
 280 */
 281int qed_dmae_info_alloc(struct qed_hwfn *p_hwfn);
 282
 283/**
 284 * @brief qed_dmae_info_free - Free the dmae_info structure
 285 * which is part of p_hwfn
 286 *
 287 * @param p_hwfn
 288 */
 289void qed_dmae_info_free(struct qed_hwfn *p_hwfn);
 290
 291union qed_qm_pq_params {
 292        struct {
 293                u8 q_idx;
 294        } iscsi;
 295
 296        struct {
 297                u8 tc;
 298        }       core;
 299
 300        struct {
 301                u8      is_vf;
 302                u8      vf_id;
 303                u8      tc;
 304        }       eth;
 305
 306        struct {
 307                u8 dcqcn;
 308                u8 qpid;        /* roce relative */
 309        } roce;
 310};
 311
 312int qed_init_fw_data(struct qed_dev *cdev,
 313                     const u8 *fw_data);
 314
 315int qed_dmae_sanity(struct qed_hwfn *p_hwfn,
 316                    struct qed_ptt *p_ptt, const char *phase);
 317
 318#endif
 319