Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright 2018-2023 NXP
3 : : */
4 : :
5 : : #include <rte_mbuf.h>
6 : : #include <rte_ethdev.h>
7 : : #include <rte_malloc.h>
8 : : #include <rte_memcpy.h>
9 : : #include <rte_string_fns.h>
10 : : #include <dev_driver.h>
11 : :
12 : : #include <fslmc_logs.h>
13 : : #include <fslmc_vfio.h>
14 : : #include <dpaa2_hw_pvt.h>
15 : : #include <dpaa2_hw_dpio.h>
16 : : #include <dpaa2_hw_mempool.h>
17 : : #include <dpaa2_pmd_logs.h>
18 : :
19 : : #include "dpaa2_ethdev.h"
20 : : #include "dpaa2_sparser.h"
21 : : #include "base/dpaa2_hw_dpni_annot.h"
22 : : #define __STDC_FORMAT_MACROS
23 : : #include <stdint.h>
24 : : #include <inttypes.h>
25 : :
26 : : static uint8_t wriop_bytecode[] = {
27 : : 0x00, 0x04, 0x29, 0x42, 0x03, 0xe0, 0x12, 0x00, 0x29, 0x02,
28 : : 0x18, 0x00, 0x87, 0x3c, 0x00, 0x02, 0x18, 0x00, 0x00, 0x00
29 : : };
30 : :
31 : 0 : int dpaa2_eth_load_wriop_soft_parser(struct dpaa2_dev_priv *priv,
32 : : enum dpni_soft_sequence_dest dest)
33 : : {
34 : 0 : struct fsl_mc_io *dpni = priv->hw;
35 : : struct dpni_load_ss_cfg cfg;
36 : : struct dpni_drv_sparser_param sp_param;
37 : : uint8_t *addr;
38 : : int ret;
39 : :
40 : : memset(&sp_param, 0, sizeof(sp_param));
41 : 0 : sp_param.start_pc = priv->ss_offset;
42 : 0 : sp_param.byte_code = &wriop_bytecode[0];
43 : 0 : sp_param.size = sizeof(wriop_bytecode);
44 : :
45 : 0 : cfg.dest = dest;
46 : 0 : cfg.ss_offset = sp_param.start_pc;
47 : 0 : cfg.ss_size = sp_param.size;
48 : :
49 : 0 : addr = rte_malloc(NULL, sp_param.size, 64);
50 [ # # ]: 0 : if (!addr) {
51 : 0 : DPAA2_PMD_ERR("Memory unavailable for soft parser param");
52 : 0 : return -1;
53 : : }
54 : :
55 : : memcpy(addr, sp_param.byte_code, sp_param.size);
56 : 0 : cfg.ss_iova = DPAA2_VADDR_TO_IOVA_AND_CHECK(addr, sp_param.size);
57 [ # # ]: 0 : if (cfg.ss_iova == RTE_BAD_IOVA) {
58 : 0 : DPAA2_PMD_ERR("No IOMMU map for soft sequence(%p), size=%d",
59 : : addr, sp_param.size);
60 : 0 : rte_free(addr);
61 : :
62 : 0 : return -ENOBUFS;
63 : : }
64 : :
65 : 0 : ret = dpni_load_sw_sequence(dpni, CMD_PRI_LOW, priv->token, &cfg);
66 [ # # ]: 0 : if (ret) {
67 : 0 : DPAA2_PMD_ERR("dpni_load_sw_sequence failed");
68 : 0 : rte_free(addr);
69 : 0 : return ret;
70 : : }
71 : :
72 : 0 : priv->ss_iova = cfg.ss_iova;
73 : 0 : priv->ss_offset += sp_param.size;
74 : 0 : DPAA2_PMD_INFO("Soft parser loaded for dpni@%d", priv->hw_id);
75 : :
76 : 0 : rte_free(addr);
77 : 0 : return 0;
78 : : }
79 : :
80 : 0 : int dpaa2_eth_enable_wriop_soft_parser(struct dpaa2_dev_priv *priv,
81 : : enum dpni_soft_sequence_dest dest)
82 : : {
83 : 0 : struct fsl_mc_io *dpni = priv->hw;
84 : : struct dpni_enable_ss_cfg cfg;
85 : : uint8_t pa[3];
86 : : struct dpni_drv_sparser_param sp_param;
87 : : uint8_t *param_addr = NULL;
88 : : int ret;
89 : :
90 : : memset(&sp_param, 0, sizeof(sp_param));
91 : 0 : pa[0] = 32; /* Custom Header Length in bytes */
92 : 0 : sp_param.custom_header_first = 1;
93 : 0 : sp_param.param_offset = 32;
94 : 0 : sp_param.param_size = 1;
95 : 0 : sp_param.start_pc = priv->ss_offset;
96 : 0 : sp_param.param_array = (uint8_t *)&pa[0];
97 : :
98 : 0 : cfg.dest = dest;
99 : 0 : cfg.ss_offset = sp_param.start_pc;
100 : 0 : cfg.set_start = sp_param.custom_header_first;
101 : 0 : cfg.hxs = (uint16_t)sp_param.link_to_hard_hxs;
102 : 0 : cfg.param_offset = sp_param.param_offset;
103 : 0 : cfg.param_size = sp_param.param_size;
104 : : if (cfg.param_size) {
105 : 0 : param_addr = rte_malloc(NULL, cfg.param_size, 64);
106 [ # # ]: 0 : if (!param_addr) {
107 : 0 : DPAA2_PMD_ERR("Memory unavailable for soft parser param");
108 : 0 : return -1;
109 : : }
110 : :
111 : 0 : memcpy(param_addr, sp_param.param_array, cfg.param_size);
112 : 0 : cfg.param_iova = DPAA2_VADDR_TO_IOVA_AND_CHECK(param_addr,
113 : : cfg.param_size);
114 [ # # ]: 0 : if (cfg.param_iova == RTE_BAD_IOVA) {
115 : 0 : DPAA2_PMD_ERR("%s: No IOMMU map for %p, size=%d",
116 : : __func__, param_addr, cfg.param_size);
117 : 0 : rte_free(param_addr);
118 : :
119 : 0 : return -ENOBUFS;
120 : : }
121 : 0 : priv->ss_param_iova = cfg.param_iova;
122 : : } else {
123 : : cfg.param_iova = 0;
124 : : }
125 : :
126 : 0 : ret = dpni_enable_sw_sequence(dpni, CMD_PRI_LOW, priv->token, &cfg);
127 [ # # ]: 0 : if (ret) {
128 : 0 : DPAA2_PMD_ERR("Soft parser enabled for dpni@%d failed",
129 : : priv->hw_id);
130 : 0 : rte_free(param_addr);
131 : 0 : return ret;
132 : : }
133 : :
134 : 0 : rte_free(param_addr);
135 : 0 : DPAA2_PMD_INFO("Soft parser enabled for dpni@%d", priv->hw_id);
136 : 0 : return 0;
137 : : }
|