1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2022 Intel Corporation
12 #include <sys/eventfd.h>
13 #include <sys/ioctl.h>
16 #include <rte_malloc.h>
17 #include <rte_memcpy.h>
20 #include <rte_bus_pci.h>
21 #include <rte_bus_ifpga.h>
22 #include <rte_rawdev.h>
24 #include "afu_pmd_core.h"
25 #include "afu_pmd_he_mem.h"
27 static int he_mem_tg_test(struct afu_rawdev *dev)
29 struct he_mem_tg_priv *priv = NULL;
30 struct rte_pmd_afu_he_mem_tg_cfg *cfg = NULL;
31 struct he_mem_tg_ctx *ctx = NULL;
32 uint64_t value = 0x12345678;
34 uint64_t channel_mask = 0;
40 priv = (struct he_mem_tg_priv *)dev->priv;
44 cfg = &priv->he_mem_tg_cfg;
45 ctx = &priv->he_mem_tg_ctx;
47 IFPGA_RAWDEV_PMD_DEBUG("Channel mask: 0x%x", cfg->channel_mask);
49 rte_write64(value, ctx->addr + MEM_TG_SCRATCHPAD);
50 cap = rte_read64(ctx->addr + MEM_TG_SCRATCHPAD);
51 IFPGA_RAWDEV_PMD_DEBUG("Scratchpad value: 0x%"PRIx64, cap);
53 IFPGA_RAWDEV_PMD_ERR("Test scratchpad register failed");
57 cap = rte_read64(ctx->addr + MEM_TG_CTRL);
58 IFPGA_RAWDEV_PMD_DEBUG("Capability: 0x%"PRIx64, cap);
60 channel_mask = cfg->channel_mask & cap;
61 /* start traffic generators */
62 rte_write64(channel_mask, ctx->addr + MEM_TG_CTRL);
64 /* check test status */
65 while (t < MEM_TG_TIMEOUT_MS) {
66 value = rte_read64(ctx->addr + MEM_TG_STAT);
67 for (i = 0; i < NUM_MEM_TG_CHANNELS; i++) {
68 if (channel_mask & (1 << i)) {
69 if (TGACTIVE(value, i))
71 printf("TG channel %d test %s\n", i,
72 TGPASS(value, i) ? "pass" :
73 TGTIMEOUT(value, i) ? "timeout" :
74 TGFAIL(value, i) ? "fail" : "error");
75 channel_mask &= ~(1 << i);
80 rte_delay_ms(MEM_TG_POLL_INTERVAL_MS);
81 t += MEM_TG_POLL_INTERVAL_MS;
85 IFPGA_RAWDEV_PMD_ERR("Timeout 0x%04lx", (unsigned long)value);
92 static int he_mem_tg_init(struct afu_rawdev *dev)
94 struct he_mem_tg_priv *priv = NULL;
95 struct he_mem_tg_ctx *ctx = NULL;
100 priv = (struct he_mem_tg_priv *)dev->priv;
102 priv = rte_zmalloc(NULL, sizeof(struct he_mem_tg_priv), 0);
108 ctx = &priv->he_mem_tg_ctx;
109 ctx->addr = (uint8_t *)dev->addr;
114 static int he_mem_tg_config(struct afu_rawdev *dev, void *config,
117 struct he_mem_tg_priv *priv = NULL;
119 if (!dev || !config || !config_size)
122 priv = (struct he_mem_tg_priv *)dev->priv;
126 if (config_size != sizeof(struct rte_pmd_afu_he_mem_tg_cfg))
129 rte_memcpy(&priv->he_mem_tg_cfg, config, sizeof(priv->he_mem_tg_cfg));
134 static int he_mem_tg_close(struct afu_rawdev *dev)
145 static int he_mem_tg_dump(struct afu_rawdev *dev, FILE *f)
147 struct he_mem_tg_priv *priv = NULL;
148 struct he_mem_tg_ctx *ctx = NULL;
153 priv = (struct he_mem_tg_priv *)dev->priv;
160 ctx = &priv->he_mem_tg_ctx;
162 fprintf(f, "addr:\t\t%p\n", (void *)ctx->addr);
167 static struct afu_ops he_mem_tg_ops = {
168 .init = he_mem_tg_init,
169 .config = he_mem_tg_config,
172 .test = he_mem_tg_test,
173 .close = he_mem_tg_close,
174 .dump = he_mem_tg_dump,
178 struct afu_rawdev_drv he_mem_tg_drv = {
179 .uuid = { HE_MEM_TG_UUID_L, HE_MEM_TG_UUID_H },
180 .ops = &he_mem_tg_ops
183 AFU_PMD_REGISTER(he_mem_tg_drv);