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