dpdk/drivers/net/ark/ark_mpu.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright (c) 2015-2018 Atomic Rules LLC
   3 */
   4
   5#include <unistd.h>
   6
   7#include "ark_logs.h"
   8#include "ark_mpu.h"
   9
  10uint16_t
  11ark_api_num_queues(struct ark_mpu_t *mpu)
  12{
  13        return mpu->hw.num_queues;
  14}
  15
  16uint16_t
  17ark_api_num_queues_per_port(struct ark_mpu_t *mpu, uint16_t ark_ports)
  18{
  19        return mpu->hw.num_queues / ark_ports;
  20}
  21
  22int
  23ark_mpu_verify(struct ark_mpu_t *mpu, uint32_t obj_size)
  24{
  25        uint32_t version;
  26
  27        version = mpu->id.vernum & 0x0000fF00;
  28        if ((mpu->id.idnum != 0x2055504d) ||
  29            (mpu->hw.obj_size != obj_size) ||
  30            (version != 0x00003100)) {
  31                ARK_PMD_LOG(ERR,
  32                            "   MPU module not found as expected %08x"
  33                            " \"%c%c%c%c %c%c%c%c\"\n",
  34                            mpu->id.idnum,
  35                            mpu->id.id[0], mpu->id.id[1],
  36                            mpu->id.id[2], mpu->id.id[3],
  37                            mpu->id.ver[0], mpu->id.ver[1],
  38                            mpu->id.ver[2], mpu->id.ver[3]);
  39                ARK_PMD_LOG(ERR,
  40                            "   MPU HW num_queues: %u hw_depth %u,"
  41                            " obj_size: %u, obj_per_mrr: %u"
  42                            " Expected size %u\n",
  43                            mpu->hw.num_queues,
  44                            mpu->hw.hw_depth,
  45                            mpu->hw.obj_size,
  46                            mpu->hw.obj_per_mrr,
  47                            obj_size);
  48                return -1;
  49        }
  50        return 0;
  51}
  52
  53void
  54ark_mpu_stop(struct ark_mpu_t *mpu)
  55{
  56        mpu->cfg.command = MPU_CMD_STOP;
  57}
  58
  59void
  60ark_mpu_start(struct ark_mpu_t *mpu)
  61{
  62        mpu->cfg.command = MPU_CMD_RUN;
  63}
  64
  65int
  66ark_mpu_reset(struct ark_mpu_t *mpu)
  67{
  68        int cnt = 0;
  69
  70        mpu->cfg.command = MPU_CMD_RESET;
  71
  72        while (mpu->cfg.command != MPU_CMD_IDLE) {
  73                if (cnt++ > 1000)
  74                        break;
  75                usleep(10);
  76        }
  77        if (mpu->cfg.command != MPU_CMD_IDLE) {
  78                mpu->cfg.command = MPU_CMD_FORCE_RESET;
  79                usleep(10);
  80        }
  81        ark_mpu_reset_stats(mpu);
  82        return mpu->cfg.command != MPU_CMD_IDLE;
  83}
  84
  85void
  86ark_mpu_reset_stats(struct ark_mpu_t *mpu)
  87{
  88        mpu->stats.pci_request = 1;     /* reset stats */
  89}
  90
  91int
  92ark_mpu_configure(struct ark_mpu_t *mpu, rte_iova_t ring, uint32_t ring_size,
  93                  int is_tx)
  94{
  95        ark_mpu_reset(mpu);
  96
  97        if (!rte_is_power_of_2(ring_size)) {
  98                ARK_PMD_LOG(ERR, "Invalid ring size for MPU %d\n",
  99                            ring_size);
 100                return -1;
 101        }
 102
 103        mpu->cfg.ring_base = ring;
 104        mpu->cfg.ring_size = ring_size;
 105        mpu->cfg.ring_mask = ring_size - 1;
 106        mpu->cfg.min_host_move = is_tx ? 1 : mpu->hw.obj_per_mrr;
 107        mpu->cfg.min_hw_move = mpu->hw.obj_per_mrr;
 108        mpu->cfg.sw_prod_index = 0;
 109        mpu->cfg.hw_cons_index = 0;
 110        return 0;
 111}
 112
 113void
 114ark_mpu_dump(struct ark_mpu_t *mpu, const char *code, uint16_t qid)
 115{
 116        /* DUMP to see that we have started */
 117        ARK_PMD_LOG(DEBUG, "MPU: %s Q: %3u sw_prod %u, hw_cons: %u\n",
 118                      code, qid,
 119                      mpu->cfg.sw_prod_index, mpu->cfg.hw_cons_index);
 120        ARK_PMD_LOG(DEBUG, "MPU: %s state: %d count %d, reserved %d"
 121                      "\n",
 122                      code,
 123                      mpu->debug.state, mpu->debug.count,
 124                      mpu->debug.reserved
 125                      );
 126}
 127
 128void
 129ark_mpu_dump_setup(struct ark_mpu_t *mpu, uint16_t q_id)
 130{
 131        ARK_PMD_LOG(DEBUG, "MPU Setup Q: %u"
 132                      ARK_SU64X "\n",
 133                      q_id,
 134                      "ring_base", mpu->cfg.ring_base
 135                      );
 136}
 137