linux/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright (c) 2014-2015 Hisilicon Limited.
   4 */
   5
   6#include <linux/cdev.h>
   7#include <linux/module.h>
   8#include <linux/kernel.h>
   9#include <linux/init.h>
  10#include <linux/netdevice.h>
  11#include <linux/etherdevice.h>
  12#include <asm/cacheflush.h>
  13#include <linux/platform_device.h>
  14#include <linux/of.h>
  15#include <linux/of_address.h>
  16#include <linux/of_platform.h>
  17#include <linux/of_irq.h>
  18#include <linux/spinlock.h>
  19
  20#include "hns_dsaf_main.h"
  21#include "hns_dsaf_ppe.h"
  22#include "hns_dsaf_rcb.h"
  23
  24#define RCB_COMMON_REG_OFFSET 0x80000
  25#define TX_RING 0
  26#define RX_RING 1
  27
  28#define RCB_RESET_WAIT_TIMES 30
  29#define RCB_RESET_TRY_TIMES 10
  30
  31/* Because default mtu is 1500, rcb buffer size is set to 2048 enough */
  32#define RCB_DEFAULT_BUFFER_SIZE 2048
  33
  34/**
  35 *hns_rcb_wait_fbd_clean - clean fbd
  36 *@qs: ring struct pointer array
  37 *@q_num: num of array
  38 *@flag: tx or rx flag
  39 */
  40void hns_rcb_wait_fbd_clean(struct hnae_queue **qs, int q_num, u32 flag)
  41{
  42        int i, wait_cnt;
  43        u32 fbd_num;
  44
  45        for (wait_cnt = i = 0; i < q_num; wait_cnt++) {
  46                usleep_range(200, 300);
  47                fbd_num = 0;
  48                if (flag & RCB_INT_FLAG_TX)
  49                        fbd_num += dsaf_read_dev(qs[i],
  50                                                 RCB_RING_TX_RING_FBDNUM_REG);
  51                if (flag & RCB_INT_FLAG_RX)
  52                        fbd_num += dsaf_read_dev(qs[i],
  53                                                 RCB_RING_RX_RING_FBDNUM_REG);
  54                if (!fbd_num)
  55                        i++;
  56                if (wait_cnt >= 10000)
  57                        break;
  58        }
  59
  60        if (i < q_num)
  61                dev_err(qs[i]->handle->owner_dev,
  62                        "queue(%d) wait fbd(%d) clean fail!!\n", i, fbd_num);
  63}
  64
  65int hns_rcb_wait_tx_ring_clean(struct hnae_queue *qs)
  66{
  67        u32 head, tail;
  68        int wait_cnt;
  69
  70        tail = dsaf_read_dev(&qs->tx_ring, RCB_REG_TAIL);
  71        wait_cnt = 0;
  72        while (wait_cnt++ < HNS_MAX_WAIT_CNT) {
  73                head = dsaf_read_dev(&qs->tx_ring, RCB_REG_HEAD);
  74                if (tail == head)
  75                        break;
  76
  77                usleep_range(100, 200);
  78        }
  79
  80        if (wait_cnt >= HNS_MAX_WAIT_CNT) {
  81                dev_err(qs->dev->dev, "rcb wait timeout, head not equal to tail.\n");
  82                return -EBUSY;
  83        }
  84
  85        return 0;
  86}
  87
  88/**
  89 *hns_rcb_reset_ring_hw - ring reset
  90 *@q: ring struct pointer
  91 */
  92void hns_rcb_reset_ring_hw(struct hnae_queue *q)
  93{
  94        u32 wait_cnt;
  95        u32 try_cnt = 0;
  96        u32 could_ret;
  97
  98        u32 tx_fbd_num;
  99
 100        while (try_cnt++ < RCB_RESET_TRY_TIMES) {
 101                usleep_range(100, 200);
 102                tx_fbd_num = dsaf_read_dev(q, RCB_RING_TX_RING_FBDNUM_REG);
 103                if (tx_fbd_num)
 104                        continue;
 105
 106                dsaf_write_dev(q, RCB_RING_PREFETCH_EN_REG, 0);
 107
 108                dsaf_write_dev(q, RCB_RING_T0_BE_RST, 1);
 109
 110                msleep(20);
 111                could_ret = dsaf_read_dev(q, RCB_RING_COULD_BE_RST);
 112
 113                wait_cnt = 0;
 114                while (!could_ret && (wait_cnt < RCB_RESET_WAIT_TIMES)) {
 115                        dsaf_write_dev(q, RCB_RING_T0_BE_RST, 0);
 116
 117                        dsaf_write_dev(q, RCB_RING_T0_BE_RST, 1);
 118
 119                        msleep(20);
 120                        could_ret = dsaf_read_dev(q, RCB_RING_COULD_BE_RST);
 121
 122                        wait_cnt++;
 123                }
 124
 125                dsaf_write_dev(q, RCB_RING_T0_BE_RST, 0);
 126
 127                if (could_ret)
 128                        break;
 129        }
 130
 131        if (try_cnt >= RCB_RESET_TRY_TIMES)
 132                dev_err(q->dev->dev, "port%d reset ring fail\n",
 133                        hns_ae_get_vf_cb(q->handle)->port_index);
 134}
 135
 136/**
 137 *hns_rcb_int_ctrl_hw - rcb irq enable control
 138 *@q: hnae queue struct pointer
 139 *@flag:ring flag tx or rx
 140 *@mask:mask
 141 */
 142void hns_rcb_int_ctrl_hw(struct hnae_queue *q, u32 flag, u32 mask)
 143{
 144        u32 int_mask_en = !!mask;
 145
 146        if (flag & RCB_INT_FLAG_TX) {
 147                dsaf_write_dev(q, RCB_RING_INTMSK_TXWL_REG, int_mask_en);
 148                dsaf_write_dev(q, RCB_RING_INTMSK_TX_OVERTIME_REG,
 149                               int_mask_en);
 150        }
 151
 152        if (flag & RCB_INT_FLAG_RX) {
 153                dsaf_write_dev(q, RCB_RING_INTMSK_RXWL_REG, int_mask_en);
 154                dsaf_write_dev(q, RCB_RING_INTMSK_RX_OVERTIME_REG,
 155                               int_mask_en);
 156        }
 157}
 158
 159void hns_rcb_int_clr_hw(struct hnae_queue *q, u32 flag)
 160{
 161        if (flag & RCB_INT_FLAG_TX) {
 162                dsaf_write_dev(q, RCB_RING_INTSTS_TX_RING_REG, 1);
 163                dsaf_write_dev(q, RCB_RING_INTSTS_TX_OVERTIME_REG, 1);
 164        }
 165
 166        if (flag & RCB_INT_FLAG_RX) {
 167                dsaf_write_dev(q, RCB_RING_INTSTS_RX_RING_REG, 1);
 168                dsaf_write_dev(q, RCB_RING_INTSTS_RX_OVERTIME_REG, 1);
 169        }
 170}
 171
 172void hns_rcbv2_int_ctrl_hw(struct hnae_queue *q, u32 flag, u32 mask)
 173{
 174        u32 int_mask_en = !!mask;
 175
 176        if (flag & RCB_INT_FLAG_TX)
 177                dsaf_write_dev(q, RCB_RING_INTMSK_TXWL_REG, int_mask_en);
 178
 179        if (flag & RCB_INT_FLAG_RX)
 180                dsaf_write_dev(q, RCB_RING_INTMSK_RXWL_REG, int_mask_en);
 181}
 182
 183void hns_rcbv2_int_clr_hw(struct hnae_queue *q, u32 flag)
 184{
 185        if (flag & RCB_INT_FLAG_TX)
 186                dsaf_write_dev(q, RCBV2_TX_RING_INT_STS_REG, 1);
 187
 188        if (flag & RCB_INT_FLAG_RX)
 189                dsaf_write_dev(q, RCBV2_RX_RING_INT_STS_REG, 1);
 190}
 191
 192/**
 193 *hns_rcb_ring_enable_hw - enable ring
 194 *@q: rcb ring
 195 *@val: value to write
 196 */
 197void hns_rcb_ring_enable_hw(struct hnae_queue *q, u32 val)
 198{
 199        dsaf_write_dev(q, RCB_RING_PREFETCH_EN_REG, !!val);
 200}
 201
 202void hns_rcb_start(struct hnae_queue *q, u32 val)
 203{
 204        hns_rcb_ring_enable_hw(q, val);
 205}
 206
 207/**
 208 *hns_rcb_common_init_commit_hw - make rcb common init completed
 209 *@rcb_common: rcb common device
 210 */
 211void hns_rcb_common_init_commit_hw(struct rcb_common_cb *rcb_common)
 212{
 213        wmb();  /* Sync point before breakpoint */
 214        dsaf_write_dev(rcb_common, RCB_COM_CFG_SYS_FSH_REG, 1);
 215        wmb();  /* Sync point after breakpoint */
 216}
 217
 218/* hns_rcb_set_tx_ring_bs - init rcb ring buf size regester
 219 *@q: hnae_queue
 220 *@buf_size: buffer size set to hw
 221 */
 222void hns_rcb_set_tx_ring_bs(struct hnae_queue *q, u32 buf_size)
 223{
 224        u32 bd_size_type = hns_rcb_buf_size2type(buf_size);
 225
 226        dsaf_write_dev(q, RCB_RING_TX_RING_BD_LEN_REG,
 227                       bd_size_type);
 228}
 229
 230/* hns_rcb_set_rx_ring_bs - init rcb ring buf size regester
 231 *@q: hnae_queue
 232 *@buf_size: buffer size set to hw
 233 */
 234void hns_rcb_set_rx_ring_bs(struct hnae_queue *q, u32 buf_size)
 235{
 236        u32 bd_size_type = hns_rcb_buf_size2type(buf_size);
 237
 238        dsaf_write_dev(q, RCB_RING_RX_RING_BD_LEN_REG,
 239                       bd_size_type);
 240}
 241
 242/**
 243 *hns_rcb_ring_init - init rcb ring
 244 *@ring_pair: ring pair control block
 245 *@ring_type: ring type, RX_RING or TX_RING
 246 */
 247static void hns_rcb_ring_init(struct ring_pair_cb *ring_pair, int ring_type)
 248{
 249        struct hnae_queue *q = &ring_pair->q;
 250        struct hnae_ring *ring =
 251                (ring_type == RX_RING) ? &q->rx_ring : &q->tx_ring;
 252        dma_addr_t dma = ring->desc_dma_addr;
 253
 254        if (ring_type == RX_RING) {
 255                dsaf_write_dev(q, RCB_RING_RX_RING_BASEADDR_L_REG,
 256                               (u32)dma);
 257                dsaf_write_dev(q, RCB_RING_RX_RING_BASEADDR_H_REG,
 258                               (u32)((dma >> 31) >> 1));
 259
 260                hns_rcb_set_rx_ring_bs(q, ring->buf_size);
 261
 262                dsaf_write_dev(q, RCB_RING_RX_RING_BD_NUM_REG,
 263                               ring_pair->port_id_in_comm);
 264                dsaf_write_dev(q, RCB_RING_RX_RING_PKTLINE_REG,
 265                               ring_pair->port_id_in_comm);
 266        } else {
 267                dsaf_write_dev(q, RCB_RING_TX_RING_BASEADDR_L_REG,
 268                               (u32)dma);
 269                dsaf_write_dev(q, RCB_RING_TX_RING_BASEADDR_H_REG,
 270                               (u32)((dma >> 31) >> 1));
 271
 272                hns_rcb_set_tx_ring_bs(q, ring->buf_size);
 273
 274                dsaf_write_dev(q, RCB_RING_TX_RING_BD_NUM_REG,
 275                               ring_pair->port_id_in_comm);
 276                dsaf_write_dev(q, RCB_RING_TX_RING_PKTLINE_REG,
 277                        ring_pair->port_id_in_comm + HNS_RCB_TX_PKTLINE_OFFSET);
 278        }
 279}
 280
 281/**
 282 *hns_rcb_init_hw - init rcb hardware
 283 *@ring: rcb ring
 284 */
 285void hns_rcb_init_hw(struct ring_pair_cb *ring)
 286{
 287        hns_rcb_ring_init(ring, RX_RING);
 288        hns_rcb_ring_init(ring, TX_RING);
 289}
 290
 291/**
 292 *hns_rcb_set_port_desc_cnt - set rcb port description num
 293 *@rcb_common: rcb_common device
 294 *@port_idx:port index
 295 *@desc_cnt:BD num
 296 */
 297static void hns_rcb_set_port_desc_cnt(struct rcb_common_cb *rcb_common,
 298                                      u32 port_idx, u32 desc_cnt)
 299{
 300        dsaf_write_dev(rcb_common, RCB_CFG_BD_NUM_REG + port_idx * 4,
 301                       desc_cnt);
 302}
 303
 304static void hns_rcb_set_port_timeout(
 305        struct rcb_common_cb *rcb_common, u32 port_idx, u32 timeout)
 306{
 307        if (AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver)) {
 308                dsaf_write_dev(rcb_common, RCB_CFG_OVERTIME_REG,
 309                               timeout * HNS_RCB_CLK_FREQ_MHZ);
 310        } else if (!HNS_DSAF_IS_DEBUG(rcb_common->dsaf_dev)) {
 311                if (timeout > HNS_RCB_DEF_GAP_TIME_USECS)
 312                        dsaf_write_dev(rcb_common,
 313                                       RCB_PORT_INT_GAPTIME_REG + port_idx * 4,
 314                                       HNS_RCB_DEF_GAP_TIME_USECS);
 315                else
 316                        dsaf_write_dev(rcb_common,
 317                                       RCB_PORT_INT_GAPTIME_REG + port_idx * 4,
 318                                       timeout);
 319
 320                dsaf_write_dev(rcb_common,
 321                               RCB_PORT_CFG_OVERTIME_REG + port_idx * 4,
 322                               timeout);
 323        } else {
 324                dsaf_write_dev(rcb_common,
 325                               RCB_PORT_CFG_OVERTIME_REG + port_idx * 4,
 326                               timeout);
 327        }
 328}
 329
 330static int hns_rcb_common_get_port_num(struct rcb_common_cb *rcb_common)
 331{
 332        if (!HNS_DSAF_IS_DEBUG(rcb_common->dsaf_dev))
 333                return HNS_RCB_SERVICE_NW_ENGINE_NUM;
 334        else
 335                return HNS_RCB_DEBUG_NW_ENGINE_NUM;
 336}
 337
 338/*clr rcb comm exception irq**/
 339static void hns_rcb_comm_exc_irq_en(
 340                        struct rcb_common_cb *rcb_common, int en)
 341{
 342        u32 clr_vlue = 0xfffffffful;
 343        u32 msk_vlue = en ? 0 : 0xfffffffful;
 344
 345        /* clr int*/
 346        dsaf_write_dev(rcb_common, RCB_COM_INTSTS_ECC_ERR_REG, clr_vlue);
 347
 348        dsaf_write_dev(rcb_common, RCB_COM_SF_CFG_RING_STS, clr_vlue);
 349
 350        dsaf_write_dev(rcb_common, RCB_COM_SF_CFG_BD_RINT_STS, clr_vlue);
 351
 352        dsaf_write_dev(rcb_common, RCB_COM_RINT_TX_PKT_REG, clr_vlue);
 353        dsaf_write_dev(rcb_common, RCB_COM_AXI_ERR_STS, clr_vlue);
 354
 355        /*en msk*/
 356        dsaf_write_dev(rcb_common, RCB_COM_INTMASK_ECC_ERR_REG, msk_vlue);
 357
 358        dsaf_write_dev(rcb_common, RCB_COM_SF_CFG_INTMASK_RING, msk_vlue);
 359
 360        /*for tx bd neednot cacheline, so msk sf_txring_fbd_intmask (bit 1)**/
 361        dsaf_write_dev(rcb_common, RCB_COM_SF_CFG_INTMASK_BD, msk_vlue | 2);
 362
 363        dsaf_write_dev(rcb_common, RCB_COM_INTMSK_TX_PKT_REG, msk_vlue);
 364        dsaf_write_dev(rcb_common, RCB_COM_AXI_WR_ERR_INTMASK, msk_vlue);
 365}
 366
 367/**
 368 *hns_rcb_common_init_hw - init rcb common hardware
 369 *@rcb_common: rcb_common device
 370 *retuen 0 - success , negative --fail
 371 */
 372int hns_rcb_common_init_hw(struct rcb_common_cb *rcb_common)
 373{
 374        u32 reg_val;
 375        int i;
 376        int port_num = hns_rcb_common_get_port_num(rcb_common);
 377
 378        hns_rcb_comm_exc_irq_en(rcb_common, 0);
 379
 380        reg_val = dsaf_read_dev(rcb_common, RCB_COM_CFG_INIT_FLAG_REG);
 381        if (0x1 != (reg_val & 0x1)) {
 382                dev_err(rcb_common->dsaf_dev->dev,
 383                        "RCB_COM_CFG_INIT_FLAG_REG reg = 0x%x\n", reg_val);
 384                return -EBUSY;
 385        }
 386
 387        for (i = 0; i < port_num; i++) {
 388                hns_rcb_set_port_desc_cnt(rcb_common, i, rcb_common->desc_num);
 389                hns_rcb_set_rx_coalesced_frames(
 390                        rcb_common, i, HNS_RCB_DEF_RX_COALESCED_FRAMES);
 391                if (!AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver) &&
 392                    !HNS_DSAF_IS_DEBUG(rcb_common->dsaf_dev))
 393                        hns_rcb_set_tx_coalesced_frames(
 394                                rcb_common, i, HNS_RCB_DEF_TX_COALESCED_FRAMES);
 395                hns_rcb_set_port_timeout(
 396                        rcb_common, i, HNS_RCB_DEF_COALESCED_USECS);
 397        }
 398
 399        dsaf_write_dev(rcb_common, RCB_COM_CFG_ENDIAN_REG,
 400                       HNS_RCB_COMMON_ENDIAN);
 401
 402        if (AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver)) {
 403                dsaf_write_dev(rcb_common, RCB_COM_CFG_FNA_REG, 0x0);
 404                dsaf_write_dev(rcb_common, RCB_COM_CFG_FA_REG, 0x1);
 405        } else {
 406                dsaf_set_dev_bit(rcb_common, RCBV2_COM_CFG_USER_REG,
 407                                 RCB_COM_CFG_FNA_B, false);
 408                dsaf_set_dev_bit(rcb_common, RCBV2_COM_CFG_USER_REG,
 409                                 RCB_COM_CFG_FA_B, true);
 410                dsaf_set_dev_bit(rcb_common, RCBV2_COM_CFG_TSO_MODE_REG,
 411                                 RCB_COM_TSO_MODE_B, HNS_TSO_MODE_8BD_32K);
 412        }
 413
 414        return 0;
 415}
 416
 417int hns_rcb_buf_size2type(u32 buf_size)
 418{
 419        int bd_size_type;
 420
 421        switch (buf_size) {
 422        case 512:
 423                bd_size_type = HNS_BD_SIZE_512_TYPE;
 424                break;
 425        case 1024:
 426                bd_size_type = HNS_BD_SIZE_1024_TYPE;
 427                break;
 428        case 2048:
 429                bd_size_type = HNS_BD_SIZE_2048_TYPE;
 430                break;
 431        case 4096:
 432                bd_size_type = HNS_BD_SIZE_4096_TYPE;
 433                break;
 434        default:
 435                bd_size_type = -EINVAL;
 436        }
 437
 438        return bd_size_type;
 439}
 440
 441static void hns_rcb_ring_get_cfg(struct hnae_queue *q, int ring_type)
 442{
 443        struct hnae_ring *ring;
 444        struct rcb_common_cb *rcb_common;
 445        struct ring_pair_cb *ring_pair_cb;
 446        u16 desc_num, mdnum_ppkt;
 447        bool irq_idx, is_ver1;
 448
 449        ring_pair_cb = container_of(q, struct ring_pair_cb, q);
 450        is_ver1 = AE_IS_VER1(ring_pair_cb->rcb_common->dsaf_dev->dsaf_ver);
 451        if (ring_type == RX_RING) {
 452                ring = &q->rx_ring;
 453                ring->io_base = ring_pair_cb->q.io_base;
 454                irq_idx = HNS_RCB_IRQ_IDX_RX;
 455                mdnum_ppkt = HNS_RCB_RING_MAX_BD_PER_PKT;
 456        } else {
 457                ring = &q->tx_ring;
 458                ring->io_base = ring_pair_cb->q.io_base +
 459                        HNS_RCB_TX_REG_OFFSET;
 460                irq_idx = HNS_RCB_IRQ_IDX_TX;
 461                mdnum_ppkt = is_ver1 ? HNS_RCB_RING_MAX_TXBD_PER_PKT :
 462                                 HNS_RCBV2_RING_MAX_TXBD_PER_PKT;
 463        }
 464
 465        rcb_common = ring_pair_cb->rcb_common;
 466        desc_num = rcb_common->dsaf_dev->desc_num;
 467
 468        ring->desc = NULL;
 469        ring->desc_cb = NULL;
 470
 471        ring->irq = ring_pair_cb->virq[irq_idx];
 472        ring->desc_dma_addr = 0;
 473
 474        ring->buf_size = RCB_DEFAULT_BUFFER_SIZE;
 475        ring->desc_num = desc_num;
 476        ring->max_desc_num_per_pkt = mdnum_ppkt;
 477        ring->max_raw_data_sz_per_desc = HNS_RCB_MAX_PKT_SIZE;
 478        ring->max_pkt_size = HNS_RCB_MAX_PKT_SIZE;
 479        ring->next_to_use = 0;
 480        ring->next_to_clean = 0;
 481}
 482
 483static void hns_rcb_ring_pair_get_cfg(struct ring_pair_cb *ring_pair_cb)
 484{
 485        ring_pair_cb->q.handle = NULL;
 486
 487        hns_rcb_ring_get_cfg(&ring_pair_cb->q, RX_RING);
 488        hns_rcb_ring_get_cfg(&ring_pair_cb->q, TX_RING);
 489}
 490
 491static int hns_rcb_get_port_in_comm(
 492        struct rcb_common_cb *rcb_common, int ring_idx)
 493{
 494        return ring_idx / (rcb_common->max_q_per_vf * rcb_common->max_vfn);
 495}
 496
 497#define SERVICE_RING_IRQ_IDX(v1) \
 498        ((v1) ? HNS_SERVICE_RING_IRQ_IDX : HNSV2_SERVICE_RING_IRQ_IDX)
 499static int hns_rcb_get_base_irq_idx(struct rcb_common_cb *rcb_common)
 500{
 501        bool is_ver1 = AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver);
 502
 503        if (!HNS_DSAF_IS_DEBUG(rcb_common->dsaf_dev))
 504                return SERVICE_RING_IRQ_IDX(is_ver1);
 505        else
 506                return  HNS_DEBUG_RING_IRQ_IDX;
 507}
 508
 509#define RCB_COMM_BASE_TO_RING_BASE(base, ringid)\
 510        ((base) + 0x10000 + HNS_RCB_REG_OFFSET * (ringid))
 511/**
 512 *hns_rcb_get_cfg - get rcb config
 513 *@rcb_common: rcb common device
 514 */
 515int hns_rcb_get_cfg(struct rcb_common_cb *rcb_common)
 516{
 517        struct ring_pair_cb *ring_pair_cb;
 518        u32 i;
 519        u32 ring_num = rcb_common->ring_num;
 520        int base_irq_idx = hns_rcb_get_base_irq_idx(rcb_common);
 521        struct platform_device *pdev =
 522                to_platform_device(rcb_common->dsaf_dev->dev);
 523        bool is_ver1 = AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver);
 524
 525        for (i = 0; i < ring_num; i++) {
 526                ring_pair_cb = &rcb_common->ring_pair_cb[i];
 527                ring_pair_cb->rcb_common = rcb_common;
 528                ring_pair_cb->dev = rcb_common->dsaf_dev->dev;
 529                ring_pair_cb->index = i;
 530                ring_pair_cb->q.io_base =
 531                        RCB_COMM_BASE_TO_RING_BASE(rcb_common->io_base, i);
 532                ring_pair_cb->port_id_in_comm =
 533                        hns_rcb_get_port_in_comm(rcb_common, i);
 534                ring_pair_cb->virq[HNS_RCB_IRQ_IDX_TX] =
 535                is_ver1 ? platform_get_irq(pdev, base_irq_idx + i * 2) :
 536                          platform_get_irq(pdev, base_irq_idx + i * 3 + 1);
 537                ring_pair_cb->virq[HNS_RCB_IRQ_IDX_RX] =
 538                is_ver1 ? platform_get_irq(pdev, base_irq_idx + i * 2 + 1) :
 539                          platform_get_irq(pdev, base_irq_idx + i * 3);
 540                if ((ring_pair_cb->virq[HNS_RCB_IRQ_IDX_TX] == -EPROBE_DEFER) ||
 541                    (ring_pair_cb->virq[HNS_RCB_IRQ_IDX_RX] == -EPROBE_DEFER))
 542                        return -EPROBE_DEFER;
 543
 544                ring_pair_cb->q.phy_base =
 545                        RCB_COMM_BASE_TO_RING_BASE(rcb_common->phy_base, i);
 546                hns_rcb_ring_pair_get_cfg(ring_pair_cb);
 547        }
 548
 549        return 0;
 550}
 551
 552/**
 553 *hns_rcb_get_rx_coalesced_frames - get rcb port rx coalesced frames
 554 *@rcb_common: rcb_common device
 555 *@port_idx:port id in comm
 556 *
 557 *Returns: coalesced_frames
 558 */
 559u32 hns_rcb_get_rx_coalesced_frames(
 560        struct rcb_common_cb *rcb_common, u32 port_idx)
 561{
 562        return dsaf_read_dev(rcb_common, RCB_CFG_PKTLINE_REG + port_idx * 4);
 563}
 564
 565/**
 566 *hns_rcb_get_tx_coalesced_frames - get rcb port tx coalesced frames
 567 *@rcb_common: rcb_common device
 568 *@port_idx:port id in comm
 569 *
 570 *Returns: coalesced_frames
 571 */
 572u32 hns_rcb_get_tx_coalesced_frames(
 573        struct rcb_common_cb *rcb_common, u32 port_idx)
 574{
 575        u64 reg;
 576
 577        reg = RCB_CFG_PKTLINE_REG + (port_idx + HNS_RCB_TX_PKTLINE_OFFSET) * 4;
 578        return dsaf_read_dev(rcb_common, reg);
 579}
 580
 581/**
 582 *hns_rcb_get_coalesce_usecs - get rcb port coalesced time_out
 583 *@rcb_common: rcb_common device
 584 *@port_idx:port id in comm
 585 *
 586 *Returns: time_out
 587 */
 588u32 hns_rcb_get_coalesce_usecs(
 589        struct rcb_common_cb *rcb_common, u32 port_idx)
 590{
 591        if (AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver))
 592                return dsaf_read_dev(rcb_common, RCB_CFG_OVERTIME_REG) /
 593                       HNS_RCB_CLK_FREQ_MHZ;
 594        else
 595                return dsaf_read_dev(rcb_common,
 596                                     RCB_PORT_CFG_OVERTIME_REG + port_idx * 4);
 597}
 598
 599/**
 600 *hns_rcb_set_coalesce_usecs - set rcb port coalesced time_out
 601 *@rcb_common: rcb_common device
 602 *@port_idx:port id in comm
 603 *@timeout:tx/rx time for coalesced time_out
 604 *
 605 * Returns:
 606 * Zero for success, or an error code in case of failure
 607 */
 608int hns_rcb_set_coalesce_usecs(
 609        struct rcb_common_cb *rcb_common, u32 port_idx, u32 timeout)
 610{
 611        u32 old_timeout = hns_rcb_get_coalesce_usecs(rcb_common, port_idx);
 612
 613        if (timeout == old_timeout)
 614                return 0;
 615
 616        if (AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver)) {
 617                if (!HNS_DSAF_IS_DEBUG(rcb_common->dsaf_dev)) {
 618                        dev_err(rcb_common->dsaf_dev->dev,
 619                                "error: not support coalesce_usecs setting!\n");
 620                        return -EINVAL;
 621                }
 622        }
 623        if (timeout > HNS_RCB_MAX_COALESCED_USECS || timeout == 0) {
 624                dev_err(rcb_common->dsaf_dev->dev,
 625                        "error: coalesce_usecs setting supports 1~1023us\n");
 626                return -EINVAL;
 627        }
 628        hns_rcb_set_port_timeout(rcb_common, port_idx, timeout);
 629        return 0;
 630}
 631
 632/**
 633 *hns_rcb_set_tx_coalesced_frames - set rcb coalesced frames
 634 *@rcb_common: rcb_common device
 635 *@port_idx:port id in comm
 636 *@coalesced_frames:tx/rx BD num for coalesced frames
 637 *
 638 * Returns:
 639 * Zero for success, or an error code in case of failure
 640 */
 641int hns_rcb_set_tx_coalesced_frames(
 642        struct rcb_common_cb *rcb_common, u32 port_idx, u32 coalesced_frames)
 643{
 644        u32 old_waterline =
 645                hns_rcb_get_tx_coalesced_frames(rcb_common, port_idx);
 646        u64 reg;
 647
 648        if (coalesced_frames == old_waterline)
 649                return 0;
 650
 651        if (coalesced_frames != 1) {
 652                dev_err(rcb_common->dsaf_dev->dev,
 653                        "error: not support tx coalesce_frames setting!\n");
 654                return -EINVAL;
 655        }
 656
 657        reg = RCB_CFG_PKTLINE_REG + (port_idx + HNS_RCB_TX_PKTLINE_OFFSET) * 4;
 658        dsaf_write_dev(rcb_common, reg, coalesced_frames);
 659        return 0;
 660}
 661
 662/**
 663 *hns_rcb_set_rx_coalesced_frames - set rcb rx coalesced frames
 664 *@rcb_common: rcb_common device
 665 *@port_idx:port id in comm
 666 *@coalesced_frames:tx/rx BD num for coalesced frames
 667 *
 668 * Returns:
 669 * Zero for success, or an error code in case of failure
 670 */
 671int hns_rcb_set_rx_coalesced_frames(
 672        struct rcb_common_cb *rcb_common, u32 port_idx, u32 coalesced_frames)
 673{
 674        u32 old_waterline =
 675                hns_rcb_get_rx_coalesced_frames(rcb_common, port_idx);
 676
 677        if (coalesced_frames == old_waterline)
 678                return 0;
 679
 680        if (coalesced_frames >= rcb_common->desc_num ||
 681            coalesced_frames > HNS_RCB_MAX_COALESCED_FRAMES ||
 682            coalesced_frames < HNS_RCB_MIN_COALESCED_FRAMES) {
 683                dev_err(rcb_common->dsaf_dev->dev,
 684                        "error: not support coalesce_frames setting!\n");
 685                return -EINVAL;
 686        }
 687
 688        dsaf_write_dev(rcb_common, RCB_CFG_PKTLINE_REG + port_idx * 4,
 689                       coalesced_frames);
 690        return 0;
 691}
 692
 693/**
 694 *hns_rcb_get_queue_mode - get max VM number and max ring number per VM
 695 *                                              accordding to dsaf mode
 696 *@dsaf_mode: dsaf mode
 697 *@max_vfn : max vfn number
 698 *@max_q_per_vf:max ring number per vm
 699 */
 700void hns_rcb_get_queue_mode(enum dsaf_mode dsaf_mode, u16 *max_vfn,
 701                            u16 *max_q_per_vf)
 702{
 703        switch (dsaf_mode) {
 704        case DSAF_MODE_DISABLE_6PORT_0VM:
 705                *max_vfn = 1;
 706                *max_q_per_vf = 16;
 707                break;
 708        case DSAF_MODE_DISABLE_FIX:
 709        case DSAF_MODE_DISABLE_SP:
 710                *max_vfn = 1;
 711                *max_q_per_vf = 1;
 712                break;
 713        case DSAF_MODE_DISABLE_2PORT_64VM:
 714                *max_vfn = 64;
 715                *max_q_per_vf = 1;
 716                break;
 717        case DSAF_MODE_DISABLE_6PORT_16VM:
 718                *max_vfn = 16;
 719                *max_q_per_vf = 1;
 720                break;
 721        default:
 722                *max_vfn = 1;
 723                *max_q_per_vf = 16;
 724                break;
 725        }
 726}
 727
 728static int hns_rcb_get_ring_num(struct dsaf_device *dsaf_dev)
 729{
 730        switch (dsaf_dev->dsaf_mode) {
 731        case DSAF_MODE_ENABLE_FIX:
 732        case DSAF_MODE_DISABLE_SP:
 733                return 1;
 734
 735        case DSAF_MODE_DISABLE_FIX:
 736                return 6;
 737
 738        case DSAF_MODE_ENABLE_0VM:
 739                return 32;
 740
 741        case DSAF_MODE_DISABLE_6PORT_0VM:
 742        case DSAF_MODE_ENABLE_16VM:
 743        case DSAF_MODE_DISABLE_6PORT_2VM:
 744        case DSAF_MODE_DISABLE_6PORT_16VM:
 745        case DSAF_MODE_DISABLE_6PORT_4VM:
 746        case DSAF_MODE_ENABLE_8VM:
 747                return 96;
 748
 749        case DSAF_MODE_DISABLE_2PORT_16VM:
 750        case DSAF_MODE_DISABLE_2PORT_8VM:
 751        case DSAF_MODE_ENABLE_32VM:
 752        case DSAF_MODE_DISABLE_2PORT_64VM:
 753        case DSAF_MODE_ENABLE_128VM:
 754                return 128;
 755
 756        default:
 757                dev_warn(dsaf_dev->dev,
 758                         "get ring num fail,use default!dsaf_mode=%d\n",
 759                         dsaf_dev->dsaf_mode);
 760                return 128;
 761        }
 762}
 763
 764static u8 __iomem *hns_rcb_common_get_vaddr(struct rcb_common_cb *rcb_common)
 765{
 766        struct dsaf_device *dsaf_dev = rcb_common->dsaf_dev;
 767
 768        return dsaf_dev->ppe_base + RCB_COMMON_REG_OFFSET;
 769}
 770
 771static phys_addr_t hns_rcb_common_get_paddr(struct rcb_common_cb *rcb_common)
 772{
 773        struct dsaf_device *dsaf_dev = rcb_common->dsaf_dev;
 774
 775        return dsaf_dev->ppe_paddr + RCB_COMMON_REG_OFFSET;
 776}
 777
 778int hns_rcb_common_get_cfg(struct dsaf_device *dsaf_dev,
 779                           int comm_index)
 780{
 781        struct rcb_common_cb *rcb_common;
 782        enum dsaf_mode dsaf_mode = dsaf_dev->dsaf_mode;
 783        u16 max_vfn;
 784        u16 max_q_per_vf;
 785        int ring_num = hns_rcb_get_ring_num(dsaf_dev);
 786
 787        rcb_common =
 788                devm_kzalloc(dsaf_dev->dev,
 789                             struct_size(rcb_common, ring_pair_cb, ring_num),
 790                             GFP_KERNEL);
 791        if (!rcb_common) {
 792                dev_err(dsaf_dev->dev, "rcb common devm_kzalloc fail!\n");
 793                return -ENOMEM;
 794        }
 795        rcb_common->comm_index = comm_index;
 796        rcb_common->ring_num = ring_num;
 797        rcb_common->dsaf_dev = dsaf_dev;
 798
 799        rcb_common->desc_num = dsaf_dev->desc_num;
 800
 801        hns_rcb_get_queue_mode(dsaf_mode, &max_vfn, &max_q_per_vf);
 802        rcb_common->max_vfn = max_vfn;
 803        rcb_common->max_q_per_vf = max_q_per_vf;
 804
 805        rcb_common->io_base = hns_rcb_common_get_vaddr(rcb_common);
 806        rcb_common->phy_base = hns_rcb_common_get_paddr(rcb_common);
 807
 808        dsaf_dev->rcb_common[comm_index] = rcb_common;
 809        return 0;
 810}
 811
 812void hns_rcb_common_free_cfg(struct dsaf_device *dsaf_dev,
 813                             u32 comm_index)
 814{
 815        dsaf_dev->rcb_common[comm_index] = NULL;
 816}
 817
 818void hns_rcb_update_stats(struct hnae_queue *queue)
 819{
 820        struct ring_pair_cb *ring =
 821                container_of(queue, struct ring_pair_cb, q);
 822        struct dsaf_device *dsaf_dev = ring->rcb_common->dsaf_dev;
 823        struct ppe_common_cb *ppe_common
 824                = dsaf_dev->ppe_common[ring->rcb_common->comm_index];
 825        struct hns_ring_hw_stats *hw_stats = &ring->hw_stats;
 826
 827        hw_stats->rx_pkts += dsaf_read_dev(queue,
 828                         RCB_RING_RX_RING_PKTNUM_RECORD_REG);
 829        dsaf_write_dev(queue, RCB_RING_RX_RING_PKTNUM_RECORD_REG, 0x1);
 830
 831        hw_stats->ppe_rx_ok_pkts += dsaf_read_dev(ppe_common,
 832                         PPE_COM_HIS_RX_PKT_QID_OK_CNT_REG + 4 * ring->index);
 833        hw_stats->ppe_rx_drop_pkts += dsaf_read_dev(ppe_common,
 834                         PPE_COM_HIS_RX_PKT_QID_DROP_CNT_REG + 4 * ring->index);
 835
 836        hw_stats->tx_pkts += dsaf_read_dev(queue,
 837                         RCB_RING_TX_RING_PKTNUM_RECORD_REG);
 838        dsaf_write_dev(queue, RCB_RING_TX_RING_PKTNUM_RECORD_REG, 0x1);
 839
 840        hw_stats->ppe_tx_ok_pkts += dsaf_read_dev(ppe_common,
 841                         PPE_COM_HIS_TX_PKT_QID_OK_CNT_REG + 4 * ring->index);
 842        hw_stats->ppe_tx_drop_pkts += dsaf_read_dev(ppe_common,
 843                         PPE_COM_HIS_TX_PKT_QID_ERR_CNT_REG + 4 * ring->index);
 844}
 845
 846/**
 847 *hns_rcb_get_stats - get rcb statistic
 848 *@queue: rcb ring
 849 *@data:statistic value
 850 */
 851void hns_rcb_get_stats(struct hnae_queue *queue, u64 *data)
 852{
 853        u64 *regs_buff = data;
 854        struct ring_pair_cb *ring =
 855                container_of(queue, struct ring_pair_cb, q);
 856        struct hns_ring_hw_stats *hw_stats = &ring->hw_stats;
 857
 858        regs_buff[0] = hw_stats->tx_pkts;
 859        regs_buff[1] = hw_stats->ppe_tx_ok_pkts;
 860        regs_buff[2] = hw_stats->ppe_tx_drop_pkts;
 861        regs_buff[3] =
 862                dsaf_read_dev(queue, RCB_RING_TX_RING_FBDNUM_REG);
 863
 864        regs_buff[4] = queue->tx_ring.stats.tx_pkts;
 865        regs_buff[5] = queue->tx_ring.stats.tx_bytes;
 866        regs_buff[6] = queue->tx_ring.stats.tx_err_cnt;
 867        regs_buff[7] = queue->tx_ring.stats.io_err_cnt;
 868        regs_buff[8] = queue->tx_ring.stats.sw_err_cnt;
 869        regs_buff[9] = queue->tx_ring.stats.seg_pkt_cnt;
 870        regs_buff[10] = queue->tx_ring.stats.restart_queue;
 871        regs_buff[11] = queue->tx_ring.stats.tx_busy;
 872
 873        regs_buff[12] = hw_stats->rx_pkts;
 874        regs_buff[13] = hw_stats->ppe_rx_ok_pkts;
 875        regs_buff[14] = hw_stats->ppe_rx_drop_pkts;
 876        regs_buff[15] =
 877                dsaf_read_dev(queue, RCB_RING_RX_RING_FBDNUM_REG);
 878
 879        regs_buff[16] = queue->rx_ring.stats.rx_pkts;
 880        regs_buff[17] = queue->rx_ring.stats.rx_bytes;
 881        regs_buff[18] = queue->rx_ring.stats.rx_err_cnt;
 882        regs_buff[19] = queue->rx_ring.stats.io_err_cnt;
 883        regs_buff[20] = queue->rx_ring.stats.sw_err_cnt;
 884        regs_buff[21] = queue->rx_ring.stats.seg_pkt_cnt;
 885        regs_buff[22] = queue->rx_ring.stats.reuse_pg_cnt;
 886        regs_buff[23] = queue->rx_ring.stats.err_pkt_len;
 887        regs_buff[24] = queue->rx_ring.stats.non_vld_descs;
 888        regs_buff[25] = queue->rx_ring.stats.err_bd_num;
 889        regs_buff[26] = queue->rx_ring.stats.l2_err;
 890        regs_buff[27] = queue->rx_ring.stats.l3l4_csum_err;
 891}
 892
 893/**
 894 *hns_rcb_get_ring_sset_count - rcb string set count
 895 *@stringset:ethtool cmd
 896 *return rcb ring string set count
 897 */
 898int hns_rcb_get_ring_sset_count(int stringset)
 899{
 900        if (stringset == ETH_SS_STATS)
 901                return HNS_RING_STATIC_REG_NUM;
 902
 903        return 0;
 904}
 905
 906/**
 907 *hns_rcb_get_common_regs_count - rcb common regs count
 908 *return regs count
 909 */
 910int hns_rcb_get_common_regs_count(void)
 911{
 912        return HNS_RCB_COMMON_DUMP_REG_NUM;
 913}
 914
 915/**
 916 *hns_rcb_get_ring_regs_count - rcb ring regs count
 917 *return regs count
 918 */
 919int hns_rcb_get_ring_regs_count(void)
 920{
 921        return HNS_RCB_RING_DUMP_REG_NUM;
 922}
 923
 924/**
 925 *hns_rcb_get_strings - get rcb string set
 926 *@stringset:string set index
 927 *@data:strings name value
 928 *@index:queue index
 929 */
 930void hns_rcb_get_strings(int stringset, u8 *data, int index)
 931{
 932        u8 *buff = data;
 933
 934        if (stringset != ETH_SS_STATS)
 935                return;
 936
 937        ethtool_sprintf(&buff, "tx_ring%d_rcb_pkt_num", index);
 938        ethtool_sprintf(&buff, "tx_ring%d_ppe_tx_pkt_num", index);
 939        ethtool_sprintf(&buff, "tx_ring%d_ppe_drop_pkt_num", index);
 940        ethtool_sprintf(&buff, "tx_ring%d_fbd_num", index);
 941
 942        ethtool_sprintf(&buff, "tx_ring%d_pkt_num", index);
 943        ethtool_sprintf(&buff, "tx_ring%d_bytes", index);
 944        ethtool_sprintf(&buff, "tx_ring%d_err_cnt", index);
 945        ethtool_sprintf(&buff, "tx_ring%d_io_err", index);
 946        ethtool_sprintf(&buff, "tx_ring%d_sw_err", index);
 947        ethtool_sprintf(&buff, "tx_ring%d_seg_pkt", index);
 948        ethtool_sprintf(&buff, "tx_ring%d_restart_queue", index);
 949        ethtool_sprintf(&buff, "tx_ring%d_tx_busy", index);
 950
 951        ethtool_sprintf(&buff, "rx_ring%d_rcb_pkt_num", index);
 952        ethtool_sprintf(&buff, "rx_ring%d_ppe_pkt_num", index);
 953        ethtool_sprintf(&buff, "rx_ring%d_ppe_drop_pkt_num", index);
 954        ethtool_sprintf(&buff, "rx_ring%d_fbd_num", index);
 955
 956        ethtool_sprintf(&buff, "rx_ring%d_pkt_num", index);
 957        ethtool_sprintf(&buff, "rx_ring%d_bytes", index);
 958        ethtool_sprintf(&buff, "rx_ring%d_err_cnt", index);
 959        ethtool_sprintf(&buff, "rx_ring%d_io_err", index);
 960        ethtool_sprintf(&buff, "rx_ring%d_sw_err", index);
 961        ethtool_sprintf(&buff, "rx_ring%d_seg_pkt", index);
 962        ethtool_sprintf(&buff, "rx_ring%d_reuse_pg", index);
 963        ethtool_sprintf(&buff, "rx_ring%d_len_err", index);
 964        ethtool_sprintf(&buff, "rx_ring%d_non_vld_desc_err", index);
 965        ethtool_sprintf(&buff, "rx_ring%d_bd_num_err", index);
 966        ethtool_sprintf(&buff, "rx_ring%d_l2_err", index);
 967        ethtool_sprintf(&buff, "rx_ring%d_l3l4csum_err", index);
 968}
 969
 970void hns_rcb_get_common_regs(struct rcb_common_cb *rcb_com, void *data)
 971{
 972        u32 *regs = data;
 973        bool is_ver1 = AE_IS_VER1(rcb_com->dsaf_dev->dsaf_ver);
 974        bool is_dbg = HNS_DSAF_IS_DEBUG(rcb_com->dsaf_dev);
 975        u32 reg_tmp;
 976        u32 reg_num_tmp;
 977        u32 i;
 978
 979        /*rcb common registers */
 980        regs[0] = dsaf_read_dev(rcb_com, RCB_COM_CFG_ENDIAN_REG);
 981        regs[1] = dsaf_read_dev(rcb_com, RCB_COM_CFG_SYS_FSH_REG);
 982        regs[2] = dsaf_read_dev(rcb_com, RCB_COM_CFG_INIT_FLAG_REG);
 983
 984        regs[3] = dsaf_read_dev(rcb_com, RCB_COM_CFG_PKT_REG);
 985        regs[4] = dsaf_read_dev(rcb_com, RCB_COM_CFG_RINVLD_REG);
 986        regs[5] = dsaf_read_dev(rcb_com, RCB_COM_CFG_FNA_REG);
 987        regs[6] = dsaf_read_dev(rcb_com, RCB_COM_CFG_FA_REG);
 988        regs[7] = dsaf_read_dev(rcb_com, RCB_COM_CFG_PKT_TC_BP_REG);
 989        regs[8] = dsaf_read_dev(rcb_com, RCB_COM_CFG_PPE_TNL_CLKEN_REG);
 990
 991        regs[9] = dsaf_read_dev(rcb_com, RCB_COM_INTMSK_TX_PKT_REG);
 992        regs[10] = dsaf_read_dev(rcb_com, RCB_COM_RINT_TX_PKT_REG);
 993        regs[11] = dsaf_read_dev(rcb_com, RCB_COM_INTMASK_ECC_ERR_REG);
 994        regs[12] = dsaf_read_dev(rcb_com, RCB_COM_INTSTS_ECC_ERR_REG);
 995        regs[13] = dsaf_read_dev(rcb_com, RCB_COM_EBD_SRAM_ERR_REG);
 996        regs[14] = dsaf_read_dev(rcb_com, RCB_COM_RXRING_ERR_REG);
 997        regs[15] = dsaf_read_dev(rcb_com, RCB_COM_TXRING_ERR_REG);
 998        regs[16] = dsaf_read_dev(rcb_com, RCB_COM_TX_FBD_ERR_REG);
 999        regs[17] = dsaf_read_dev(rcb_com, RCB_SRAM_ECC_CHK_EN_REG);
1000        regs[18] = dsaf_read_dev(rcb_com, RCB_SRAM_ECC_CHK0_REG);
1001        regs[19] = dsaf_read_dev(rcb_com, RCB_SRAM_ECC_CHK1_REG);
1002        regs[20] = dsaf_read_dev(rcb_com, RCB_SRAM_ECC_CHK2_REG);
1003        regs[21] = dsaf_read_dev(rcb_com, RCB_SRAM_ECC_CHK3_REG);
1004        regs[22] = dsaf_read_dev(rcb_com, RCB_SRAM_ECC_CHK4_REG);
1005        regs[23] = dsaf_read_dev(rcb_com, RCB_SRAM_ECC_CHK5_REG);
1006        regs[24] = dsaf_read_dev(rcb_com, RCB_ECC_ERR_ADDR0_REG);
1007        regs[25] = dsaf_read_dev(rcb_com, RCB_ECC_ERR_ADDR3_REG);
1008        regs[26] = dsaf_read_dev(rcb_com, RCB_ECC_ERR_ADDR4_REG);
1009        regs[27] = dsaf_read_dev(rcb_com, RCB_ECC_ERR_ADDR5_REG);
1010
1011        regs[28] = dsaf_read_dev(rcb_com, RCB_COM_SF_CFG_INTMASK_RING);
1012        regs[29] = dsaf_read_dev(rcb_com, RCB_COM_SF_CFG_RING_STS);
1013        regs[30] = dsaf_read_dev(rcb_com, RCB_COM_SF_CFG_RING);
1014        regs[31] = dsaf_read_dev(rcb_com, RCB_COM_SF_CFG_INTMASK_BD);
1015        regs[32] = dsaf_read_dev(rcb_com, RCB_COM_SF_CFG_BD_RINT_STS);
1016        regs[33] = dsaf_read_dev(rcb_com, RCB_COM_RCB_RD_BD_BUSY);
1017        regs[34] = dsaf_read_dev(rcb_com, RCB_COM_RCB_FBD_CRT_EN);
1018        regs[35] = dsaf_read_dev(rcb_com, RCB_COM_AXI_WR_ERR_INTMASK);
1019        regs[36] = dsaf_read_dev(rcb_com, RCB_COM_AXI_ERR_STS);
1020        regs[37] = dsaf_read_dev(rcb_com, RCB_COM_CHK_TX_FBD_NUM_REG);
1021
1022        /* rcb common entry registers */
1023        for (i = 0; i < 16; i++) { /* total 16 model registers */
1024                regs[38 + i]
1025                        = dsaf_read_dev(rcb_com, RCB_CFG_BD_NUM_REG + 4 * i);
1026                regs[54 + i]
1027                        = dsaf_read_dev(rcb_com, RCB_CFG_PKTLINE_REG + 4 * i);
1028        }
1029
1030        reg_tmp = is_ver1 ? RCB_CFG_OVERTIME_REG : RCB_PORT_CFG_OVERTIME_REG;
1031        reg_num_tmp = (is_ver1 || is_dbg) ? 1 : 6;
1032        for (i = 0; i < reg_num_tmp; i++)
1033                regs[70 + i] = dsaf_read_dev(rcb_com, reg_tmp);
1034
1035        regs[76] = dsaf_read_dev(rcb_com, RCB_CFG_PKTLINE_INT_NUM_REG);
1036        regs[77] = dsaf_read_dev(rcb_com, RCB_CFG_OVERTIME_INT_NUM_REG);
1037
1038        /* mark end of rcb common regs */
1039        for (i = 78; i < 80; i++)
1040                regs[i] = 0xcccccccc;
1041}
1042
1043void hns_rcb_get_ring_regs(struct hnae_queue *queue, void *data)
1044{
1045        u32 *regs = data;
1046        struct ring_pair_cb *ring_pair
1047                = container_of(queue, struct ring_pair_cb, q);
1048        u32 i;
1049
1050        /*rcb ring registers */
1051        regs[0] = dsaf_read_dev(queue, RCB_RING_RX_RING_BASEADDR_L_REG);
1052        regs[1] = dsaf_read_dev(queue, RCB_RING_RX_RING_BASEADDR_H_REG);
1053        regs[2] = dsaf_read_dev(queue, RCB_RING_RX_RING_BD_NUM_REG);
1054        regs[3] = dsaf_read_dev(queue, RCB_RING_RX_RING_BD_LEN_REG);
1055        regs[4] = dsaf_read_dev(queue, RCB_RING_RX_RING_PKTLINE_REG);
1056        regs[5] = dsaf_read_dev(queue, RCB_RING_RX_RING_TAIL_REG);
1057        regs[6] = dsaf_read_dev(queue, RCB_RING_RX_RING_HEAD_REG);
1058        regs[7] = dsaf_read_dev(queue, RCB_RING_RX_RING_FBDNUM_REG);
1059        regs[8] = dsaf_read_dev(queue, RCB_RING_RX_RING_PKTNUM_RECORD_REG);
1060
1061        regs[9] = dsaf_read_dev(queue, RCB_RING_TX_RING_BASEADDR_L_REG);
1062        regs[10] = dsaf_read_dev(queue, RCB_RING_TX_RING_BASEADDR_H_REG);
1063        regs[11] = dsaf_read_dev(queue, RCB_RING_TX_RING_BD_NUM_REG);
1064        regs[12] = dsaf_read_dev(queue, RCB_RING_TX_RING_BD_LEN_REG);
1065        regs[13] = dsaf_read_dev(queue, RCB_RING_TX_RING_PKTLINE_REG);
1066        regs[15] = dsaf_read_dev(queue, RCB_RING_TX_RING_TAIL_REG);
1067        regs[16] = dsaf_read_dev(queue, RCB_RING_TX_RING_HEAD_REG);
1068        regs[17] = dsaf_read_dev(queue, RCB_RING_TX_RING_FBDNUM_REG);
1069        regs[18] = dsaf_read_dev(queue, RCB_RING_TX_RING_OFFSET_REG);
1070        regs[19] = dsaf_read_dev(queue, RCB_RING_TX_RING_PKTNUM_RECORD_REG);
1071
1072        regs[20] = dsaf_read_dev(queue, RCB_RING_PREFETCH_EN_REG);
1073        regs[21] = dsaf_read_dev(queue, RCB_RING_CFG_VF_NUM_REG);
1074        regs[22] = dsaf_read_dev(queue, RCB_RING_ASID_REG);
1075        regs[23] = dsaf_read_dev(queue, RCB_RING_RX_VM_REG);
1076        regs[24] = dsaf_read_dev(queue, RCB_RING_T0_BE_RST);
1077        regs[25] = dsaf_read_dev(queue, RCB_RING_COULD_BE_RST);
1078        regs[26] = dsaf_read_dev(queue, RCB_RING_WRR_WEIGHT_REG);
1079
1080        regs[27] = dsaf_read_dev(queue, RCB_RING_INTMSK_RXWL_REG);
1081        regs[28] = dsaf_read_dev(queue, RCB_RING_INTSTS_RX_RING_REG);
1082        regs[29] = dsaf_read_dev(queue, RCB_RING_INTMSK_TXWL_REG);
1083        regs[30] = dsaf_read_dev(queue, RCB_RING_INTSTS_TX_RING_REG);
1084        regs[31] = dsaf_read_dev(queue, RCB_RING_INTMSK_RX_OVERTIME_REG);
1085        regs[32] = dsaf_read_dev(queue, RCB_RING_INTSTS_RX_OVERTIME_REG);
1086        regs[33] = dsaf_read_dev(queue, RCB_RING_INTMSK_TX_OVERTIME_REG);
1087        regs[34] = dsaf_read_dev(queue, RCB_RING_INTSTS_TX_OVERTIME_REG);
1088
1089        /* mark end of ring regs */
1090        for (i = 35; i < 40; i++)
1091                regs[i] = 0xcccccc00 + ring_pair->index;
1092}
1093