get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/129824/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 129824,
    "url": "http://patchwork.dpdk.org/api/patches/129824/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230802081106.2340406-5-caowenbo@mucse.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20230802081106.2340406-5-caowenbo@mucse.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230802081106.2340406-5-caowenbo@mucse.com",
    "date": "2023-08-02T08:11:02",
    "name": "[v2,4/8] net/rnp: add mbx basic api feature",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "198bb4631cd992917b8a82d59bb31a85e11bb20e",
    "submitter": {
        "id": 2142,
        "url": "http://patchwork.dpdk.org/api/people/2142/?format=api",
        "name": "11",
        "email": "caowenbo@mucse.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20230802081106.2340406-5-caowenbo@mucse.com/mbox/",
    "series": [
        {
            "id": 29092,
            "url": "http://patchwork.dpdk.org/api/series/29092/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29092",
            "date": "2023-08-02T08:10:58",
            "name": "*** Add Support New Pmd Driver ***",
            "version": 2,
            "mbox": "http://patchwork.dpdk.org/series/29092/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/129824/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/129824/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id EAD9142FB8;\n\tWed,  2 Aug 2023 10:12:51 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id DD0C543257;\n\tWed,  2 Aug 2023 10:12:51 +0200 (CEST)",
            "from smtpbguseast3.qq.com (smtpbguseast3.qq.com [54.243.244.52])\n by mails.dpdk.org (Postfix) with ESMTP id B0FE943252\n for <dev@dpdk.org>; Wed,  2 Aug 2023 10:12:49 +0200 (CEST)",
            "from steven.localdomain ( [183.81.182.182])\n by bizesmtp.qq.com (ESMTP) with\n id ; Wed, 02 Aug 2023 16:12:34 +0800 (CST)"
        ],
        "X-QQ-mid": "bizesmtp91t1690963957tnw14h5v",
        "X-QQ-SSF": "01400000000000D0E000000B0000000",
        "X-QQ-FEAT": "wOTYu9h7OeriqqyOdE7mmwPrnPG6j1MRtnxYCeo1A/A4/rXrSasimLFna5eBG\n AXAMTbX5dvOXrJ1aaBKbUL8E1ha/mciqYZUczR9GR8R/LHNadvcA8XE9WkGp7YqjEBxxgxX\n dsrg3445erXtiuWQdE+fngcz3YCcuni+Iqxax7AF0BAZDhRMpopt/BVYyjHzy0cp2T0uGce\n Y3kGCkvFZNNhzyccrnXmsjdH/zusmWPnbvLgCy/rIIFgdM5rgp12Bb08Y6Q/01L6TiqKNcT\n 4afzGrms6kO9XV1Xwmr3a7a52bYnbyNdivSMbs5/NtFcqF/KvTMsnn65x78hA2u9Yoms7qb\n 8UvLvI087x/RHzmWYKyfiqUNUav8XiKWuEEitGDQLiycZJRgF+UTJoTG00DkC+4ZouAQ/iY\n r+2rueRs+xIxUNv7k2yatQ==",
        "X-QQ-GoodBg": "2",
        "X-BIZMAIL-ID": "9043243884932276424",
        "From": "Wenbo Cao <caowenbo@mucse.com>",
        "To": "Wenbo Cao <caowenbo@mucse.com>",
        "Cc": "dev@dpdk.org, ferruh.yigit@intel.com, andrew.rybchenko@oktetlabs.ru,\n Stephen Hemminger <stephen@networkplumber.org>",
        "Subject": "[PATCH v2 4/8] net/rnp: add mbx basic api feature",
        "Date": "Wed,  2 Aug 2023 08:11:02 +0000",
        "Message-Id": "<20230802081106.2340406-5-caowenbo@mucse.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20230802081106.2340406-1-caowenbo@mucse.com>",
        "References": "<20230802081106.2340406-1-caowenbo@mucse.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-QQ-SENDSIZE": "520",
        "Feedback-ID": "bizesmtp:mucse.com:qybglogicsvrgz:qybglogicsvrgz5a-0",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "mbx base code is for communicate with the firmware\n\nSigned-off-by: Wenbo Cao <caowenbo@mucse.com>\nSuggested-by: Stephen Hemminger <stephen@networkplumber.org>\n---\n drivers/net/rnp/base/rnp_hw.h | 107 ++++++-\n drivers/net/rnp/meson.build   |   1 +\n drivers/net/rnp/rnp.h         |  35 +++\n drivers/net/rnp/rnp_ethdev.c  |  70 ++++-\n drivers/net/rnp/rnp_logs.h    |   9 +\n drivers/net/rnp/rnp_mbx.c     | 522 ++++++++++++++++++++++++++++++++++\n drivers/net/rnp/rnp_mbx.h     | 139 +++++++++\n drivers/net/rnp/rnp_mbx_fw.h  |  22 ++\n 8 files changed, 902 insertions(+), 3 deletions(-)\n create mode 100644 drivers/net/rnp/rnp_mbx.c\n create mode 100644 drivers/net/rnp/rnp_mbx.h\n create mode 100644 drivers/net/rnp/rnp_mbx_fw.h",
    "diff": "diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h\nindex 543011a64c..da3659bd67 100644\n--- a/drivers/net/rnp/base/rnp_hw.h\n+++ b/drivers/net/rnp/base/rnp_hw.h\n@@ -4,15 +4,120 @@\n #ifndef __RNP_HW_H__\n #define __RNP_HW_H__\n \n+#include <rte_io.h>\n+#include <ethdev_driver.h>\n+\n+#include \"rnp_osdep.h\"\n+\n+static inline unsigned int rnp_rd_reg(volatile void *addr)\n+{\n+\tunsigned int v = rte_read32(addr);\n+\n+\treturn v;\n+}\n+\n+static inline void rnp_wr_reg(volatile void *reg, int val)\n+{\n+\trte_write32_relaxed((val), (reg));\n+}\n+\n+#define mbx_rd32(hw, reg)\trnp_rd_reg((hw)->iobar4 + (reg))\n+#define mbx_wr32(hw, reg, val)\trnp_wr_reg((hw)->iobar4 + (reg), (val))\n+\n+struct rnp_hw;\n+/* Mbx Operate info */\n+enum MBX_ID {\n+\tMBX_PF = 0,\n+\tMBX_VF,\n+\tMBX_CM3CPU,\n+\tMBX_FW = MBX_CM3CPU,\n+\tMBX_VFCNT\n+};\n+struct rnp_mbx_api {\n+\tvoid (*init_mbx)(struct rnp_hw *hw);\n+\tint32_t (*read)(struct rnp_hw *hw,\n+\t\t\tuint32_t *msg,\n+\t\t\tuint16_t size,\n+\t\t\tenum MBX_ID);\n+\tint32_t (*write)(struct rnp_hw *hw,\n+\t\t\tuint32_t *msg,\n+\t\t\tuint16_t size,\n+\t\t\tenum MBX_ID);\n+\tint32_t (*read_posted)(struct rte_eth_dev *dev,\n+\t\t\tuint32_t *msg,\n+\t\t\tuint16_t size,\n+\t\t\tenum MBX_ID);\n+\tint32_t (*write_posted)(struct rte_eth_dev *dev,\n+\t\t\tuint32_t *msg,\n+\t\t\tuint16_t size,\n+\t\t\tenum MBX_ID);\n+\tint32_t (*check_for_msg)(struct rnp_hw *hw, enum MBX_ID);\n+\tint32_t (*check_for_ack)(struct rnp_hw *hw, enum MBX_ID);\n+\tint32_t (*check_for_rst)(struct rnp_hw *hw, enum MBX_ID);\n+\tint32_t (*configure)(struct rnp_hw *hw, int nr_vec, bool enable);\n+};\n+\n+struct rnp_mbx_stats {\n+\tu32 msgs_tx;\n+\tu32 msgs_rx;\n+\n+\tu32 acks;\n+\tu32 reqs;\n+\tu32 rsts;\n+};\n+\n+struct rnp_mbx_info {\n+\tstruct rnp_mbx_api ops;\n+\tuint32_t usec_delay;    /* retry interval delay time */\n+\tuint32_t timeout;       /* retry ops timeout limit */\n+\tuint16_t size;          /* data buffer size*/\n+\tuint16_t vf_num;        /* Virtual Function num */\n+\tuint16_t pf_num;        /* Physical Function num */\n+\tuint16_t sriov_st;      /* Sriov state */\n+\tbool irq_enabled;\n+\tunion {\n+\t\tstruct {\n+\t\t\tunsigned short pf_req;\n+\t\t\tunsigned short pf_ack;\n+\t\t};\n+\t\tstruct {\n+\t\t\tunsigned short cpu_req;\n+\t\t\tunsigned short cpu_ack;\n+\t\t};\n+\t};\n+\tunsigned short vf_req[64];\n+\tunsigned short vf_ack[64];\n+\n+\tstruct rnp_mbx_stats stats;\n+\n+\trte_atomic16_t state;\n+} __rte_cache_aligned;\n+\n+#define RNP_MAX_HW_PORT_PERR_PF (4)\n struct rnp_hw {\n \tvoid *back;\n \tchar *iobar0;\n \tuint32_t iobar0_len;\n \tchar *iobar4;\n \tuint32_t iobar4_len;\n+\tchar *link_sync;\n+\tchar *dma_base;\n+\tchar *eth_base;\n+\tchar *veb_base;\n+\tchar *mac_base[RNP_MAX_HW_PORT_PERR_PF];\n+\tchar *msix_base;\n+\t/* === dma == */\n+\tchar *dma_axi_en;\n+\tchar *dma_axi_st;\n \n \tuint16_t device_id;\n \tuint16_t vendor_id;\n-} __rte_cache_aligned;\n+\tuint16_t function;\n+\tuint16_t pf_vf_num;\n+\tuint16_t max_vfs;\n+\tvoid *cookie_pool;\n+\tchar cookie_p_name[RTE_MEMZONE_NAMESIZE];\n \n+\tstruct rnp_mbx_info mbx;\n+} __rte_cache_aligned;\n #endif /* __RNP_H__*/\ndiff --git a/drivers/net/rnp/meson.build b/drivers/net/rnp/meson.build\nindex 36a1f7148d..38dbee5ca4 100644\n--- a/drivers/net/rnp/meson.build\n+++ b/drivers/net/rnp/meson.build\n@@ -9,5 +9,6 @@ endif\n \n sources = files(\n \t\t'rnp_ethdev.c',\n+\t\t'rnp_mbx.c',\n )\n includes += include_directories('base')\ndiff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h\nindex ea9d138673..437a2cc209 100644\n--- a/drivers/net/rnp/rnp.h\n+++ b/drivers/net/rnp/rnp.h\n@@ -3,6 +3,7 @@\n  */\n #ifndef __RNP_H__\n #define __RNP_H__\n+#include <rte_log.h>\n \n #include \"base/rnp_hw.h\"\n \n@@ -14,14 +15,17 @@\n \n struct rnp_eth_port {\n \tvoid *adapt;\n+\tstruct rnp_hw *hw;\n \tstruct rte_eth_dev *eth_dev;\n } __rte_cache_aligned;\n \n struct rnp_share_ops {\n+\tconst struct rnp_mbx_api *mbx_api;\n } __rte_cache_aligned;\n \n struct rnp_eth_adapter {\n \tstruct rnp_hw hw;\n+\tuint16_t max_vfs;\n \tstruct rte_pci_device *pdev;\n \tstruct rte_eth_dev *eth_dev; /* master eth_dev */\n \tstruct rnp_eth_port *ports[RNP_MAX_PORT_OF_PF];\n@@ -34,5 +38,36 @@ struct rnp_eth_adapter {\n \t(((struct rnp_eth_port *)((eth_dev)->data->dev_private)))\n #define RNP_DEV_TO_ADAPTER(eth_dev) \\\n \t((struct rnp_eth_adapter *)(RNP_DEV_TO_PORT(eth_dev)->adapt))\n+#define RNP_DEV_TO_HW(eth_dev) \\\n+\t(&((struct rnp_eth_adapter *)(RNP_DEV_TO_PORT((eth_dev))->adapt))->hw)\n+#define RNP_DEV_PP_PRIV_TO_MBX_OPS(dev) \\\n+\t(((struct rnp_share_ops *)(dev)->process_private)->mbx_api)\n+#define RNP_DEV_TO_MBX_OPS(dev)\tRNP_DEV_PP_PRIV_TO_MBX_OPS(dev)\n \n+static inline void rnp_reg_offset_init(struct rnp_hw *hw)\n+{\n+\tuint16_t i;\n+\n+\tif (hw->device_id == RNP_DEV_ID_N10G && hw->mbx.pf_num) {\n+\t\thw->iobar4 += 0x100000;\n+\t\thw->msix_base = hw->iobar4 + 0xa0000;\n+\t\thw->msix_base += 0x200;\n+\t} else {\n+\t\thw->msix_base = hw->iobar4 + 0xa0000;\n+\t}\n+\t/* === dma status/config====== */\n+\thw->link_sync    = hw->iobar4 + 0x000c;\n+\thw->dma_axi_en   = hw->iobar4 + 0x0010;\n+\thw->dma_axi_st   = hw->iobar4 + 0x0014;\n+\n+\tif (hw->mbx.pf_num)\n+\t\thw->msix_base += 0x200;\n+\t/* === queue registers === */\n+\thw->dma_base     = hw->iobar4 + 0x08000;\n+\thw->veb_base     = hw->iobar4 + 0x0;\n+\thw->eth_base     = hw->iobar4 + 0x10000;\n+\t/* mac */\n+\tfor (i = 0; i < RNP_MAX_HW_PORT_PERR_PF; i++)\n+\t\thw->mac_base[i] = hw->iobar4 + 0x60000 + 0x10000 * i;\n+}\n #endif /* __RNP_H__ */\ndiff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c\nindex fc67515e04..47c5361f95 100644\n--- a/drivers/net/rnp/rnp_ethdev.c\n+++ b/drivers/net/rnp/rnp_ethdev.c\n@@ -8,6 +8,7 @@\n #include <ethdev_driver.h>\n \n #include \"rnp.h\"\n+#include \"rnp_mbx.h\"\n #include \"rnp_logs.h\"\n \n static int\n@@ -89,6 +90,58 @@ rnp_alloc_eth_port(struct rte_pci_device *master_pci, char *name)\n \treturn NULL;\n }\n \n+static void rnp_get_nic_attr(struct rnp_eth_adapter *adapter)\n+{\n+\tRTE_SET_USED(adapter);\n+}\n+\n+static int\n+rnp_process_resource_init(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct rnp_share_ops *share_priv;\n+\n+\t/* allocate process_private memory this must can't\n+\t * belone to the dpdk mem resource manager\n+\t * such as from rte_malloc or rte_dma_zone..\n+\t */\n+\t/* use the process_prive point to resolve secondary process\n+\t * use point-func. This point is per process will be safe to cover.\n+\t * This will cause secondary process core-dump because of IPC\n+\t * Secondary will call primary process point func virt-address\n+\t * secondary process don't alloc user/pmd to alloc or free\n+\t * the memory of dpdk-mem resource it will cause hugepage\n+\t * mem exception\n+\t * be careful for secondary Process to use the share-mem of\n+\t * point correlation\n+\t */\n+\tshare_priv = calloc(1, sizeof(*share_priv));\n+\tif (!share_priv) {\n+\t\tPMD_DRV_LOG(ERR, \"calloc share_priv failed\");\n+\t\treturn -ENOMEM;\n+\t}\n+\tmemset(share_priv, 0, sizeof(*share_priv));\n+\teth_dev->process_private = share_priv;\n+\n+\treturn 0;\n+}\n+\n+static void\n+rnp_common_ops_init(struct rnp_eth_adapter *adapter)\n+{\n+\tstruct rnp_share_ops *share_priv;\n+\n+\tshare_priv = adapter->share_priv;\n+\tshare_priv->mbx_api = &rnp_mbx_pf_ops;\n+}\n+\n+static int\n+rnp_special_ops_init(struct rte_eth_dev *eth_dev)\n+{\n+\tRTE_SET_USED(eth_dev);\n+\n+\treturn 0;\n+}\n+\n static int\n rnp_eth_dev_init(struct rte_eth_dev *dev)\n {\n@@ -124,6 +177,20 @@ rnp_eth_dev_init(struct rte_eth_dev *dev)\n \thw->device_id = pci_dev->id.device_id;\n \thw->vendor_id = pci_dev->id.vendor_id;\n \thw->device_id = pci_dev->id.device_id;\n+\tadapter->max_vfs = pci_dev->max_vfs;\n+\tret = rnp_process_resource_init(dev);\n+\tif (ret) {\n+\t\tPMD_DRV_LOG(ERR, \"share prive resource init failed\");\n+\t\treturn ret;\n+\t}\n+\tadapter->share_priv = dev->process_private;\n+\trnp_common_ops_init(adapter);\n+\trnp_get_nic_attr(adapter);\n+\t/* We need Use Device Id To Change The Resource Mode */\n+\trnp_special_ops_init(dev);\n+\tport->adapt = adapter;\n+\tport->hw = hw;\n+\trnp_init_mbx_ops_pf(hw);\n \tfor (p_id = 0; p_id < adapter->num_ports; p_id++) {\n \t\t/* port 0 resource has been alloced When Probe */\n \t\tif (!p_id) {\n@@ -158,11 +225,10 @@ rnp_eth_dev_init(struct rte_eth_dev *dev)\n \t\t\tcontinue;\n \t\tif (port->eth_dev) {\n \t\t\trnp_dev_close(port->eth_dev);\n-\t\t\trte_eth_dev_release_port(port->eth_dev);\n \t\t\tif (port->eth_dev->process_private)\n \t\t\t\tfree(port->eth_dev->process_private);\n+\t\t\trte_eth_dev_release_port(port->eth_dev);\n \t\t}\n-\t\trte_free(port);\n \t}\n \trte_free(adapter);\n \ndiff --git a/drivers/net/rnp/rnp_logs.h b/drivers/net/rnp/rnp_logs.h\nindex 1b3ee33745..f1648aabb5 100644\n--- a/drivers/net/rnp/rnp_logs.h\n+++ b/drivers/net/rnp/rnp_logs.h\n@@ -13,6 +13,15 @@ extern int rnp_drv_logtype;\n #define RNP_PMD_DRV_LOG(level, fmt, args...) \\\n \trte_log(RTE_LOG_##level, rnp_drv_logtype, \\\n \t\t\"%s() \" fmt, __func__, ##args)\n+#define PMD_DRV_LOG_RAW(level, fmt, args...) \\\n+\trte_log(RTE_LOG_ ## level, rnp_drv_logtype, \"%s(): \" fmt, \\\n+\t\t\t__func__, ## args)\n+#define PMD_DRV_LOG(level, fmt, args...) \\\n+\tPMD_DRV_LOG_RAW(level, fmt \"\\n\", ## args)\n+\n+#define RNP_PMD_LOG(level, fmt, args...) \\\n+\trte_log(RTE_LOG_##level, rnp_drv_logtype, \\\n+\t\t\t\"rnp_net: (%d) \" fmt, __LINE__, ##args)\n #ifdef RTE_LIBRTE_RNP_DEBUG_RX\n extern int rnp_rx_logtype;\n #define RNP_PMD_RX_LOG(level, fmt, args...) \\\ndiff --git a/drivers/net/rnp/rnp_mbx.c b/drivers/net/rnp/rnp_mbx.c\nnew file mode 100644\nindex 0000000000..79b214d99b\n--- /dev/null\n+++ b/drivers/net/rnp/rnp_mbx.c\n@@ -0,0 +1,522 @@\n+#include <rte_cycles.h>\n+#include <rte_log.h>\n+\n+#include \"rnp.h\"\n+#include \"rnp_hw.h\"\n+#include \"rnp_mbx.h\"\n+#include \"rnp_mbx_fw.h\"\n+#include \"rnp_logs.h\"\n+\n+#define RNP_MAX_VF_FUNCTIONS\t(64)\n+/* == VEC == */\n+#define VF2PF_MBOX_VEC(VF)\t(0xa5100 + 4 * (VF))\n+#define CPU2PF_MBOX_VEC\t\t(0xa5300)\n+\n+/* == PF <--> VF mailbox ==== */\n+#define SHARE_MEM_BYTES\t\t(64) /* 64bytes */\n+/* for PF1 rtl will remap 6000 to 0xb000 */\n+#define PF_VF_SHM(vf)\t\t((0xa6000) + (64 * (vf)))\n+#define PF2VF_COUNTER(vf)\t(PF_VF_SHM(vf) + 0)\n+#define VF2PF_COUNTER(vf)\t(PF_VF_SHM(vf) + 4)\n+#define PF_VF_SHM_DATA(vf)\t(PF_VF_SHM(vf) + 8)\n+#define PF2VF_MBOX_CTRL(vf)\t((0xa7100) + (4 * (vf)))\n+#define PF_VF_MBOX_MASK_LO\t((0xa7200))\n+#define PF_VF_MBOX_MASK_HI\t((0xa7300))\n+\n+/* === CPU <--> PF === */\n+#define CPU_PF_SHM\t\t(0xaa000)\n+#define CPU2PF_COUNTER\t\t(CPU_PF_SHM + 0)\n+#define PF2CPU_COUNTER\t\t(CPU_PF_SHM + 4)\n+#define CPU_PF_SHM_DATA\t\t(CPU_PF_SHM + 8)\n+#define PF2CPU_MBOX_CTRL\t(0xaa100)\n+#define CPU_PF_MBOX_MASK\t(0xaa300)\n+\n+/* === CPU <--> VF === */\n+#define CPU_VF_SHM(vf)\t\t(0xa8000 + (64 * (vf)))\n+#define CPU2VF_COUNTER(vf)\t(CPU_VF_SHM(vf) + 0)\n+#define VF2CPU_COUNTER(vf)\t(CPU_VF_SHM(vf) + 4)\n+#define CPU_VF_SHM_DATA(vf)\t(CPU_VF_SHM(vf) + 8)\n+#define VF2CPU_MBOX_CTRL(vf)\t(0xa9000 + 64 * (vf))\n+#define CPU_VF_MBOX_MASK_LO(vf) (0xa9200 + 64 * (vf))\n+#define CPU_VF_MBOX_MASK_HI(vf) (0xa9300 + 64 * (vf))\n+\n+#define MBOX_CTRL_REQ\t\t(1 << 0)  /* WO */\n+/* VF:WR, PF:RO */\n+#define MBOX_CTRL_PF_HOLD_SHM\t(1 << 3)  /* VF:RO, PF:WR */\n+\n+#define MBOX_IRQ_EN\t\t(0)\n+#define MBOX_IRQ_DISABLE\t(1)\n+\n+/****************************PF MBX OPS************************************/\n+static inline u16 rnp_mbx_get_req(struct rnp_hw *hw, int reg)\n+{\n+\trte_mb();\n+\treturn mbx_rd32(hw, reg) & 0xffff;\n+}\n+\n+static inline u16 rnp_mbx_get_ack(struct rnp_hw *hw, int reg)\n+{\n+\trte_mb();\n+\treturn (mbx_rd32(hw, reg) >> 16) & 0xffff;\n+}\n+\n+static inline void rnp_mbx_inc_pf_req(struct rnp_hw *hw, enum MBX_ID mbx_id)\n+{\n+\tint reg = (mbx_id == MBX_CM3CPU) ?\n+\t\tPF2CPU_COUNTER : PF2VF_COUNTER(mbx_id);\n+\tu32 v = mbx_rd32(hw, reg);\n+\tu16 req;\n+\n+\treq = (v & 0xffff);\n+\treq++;\n+\tv &= ~(0x0000ffff);\n+\tv |= req;\n+\n+\trte_mb();\n+\tmbx_wr32(hw, reg, v);\n+\n+\t/* update stats */\n+\t/* hw->mbx.stats.msgs_tx++; */\n+}\n+\n+static inline void rnp_mbx_inc_pf_ack(struct rnp_hw *hw, enum MBX_ID mbx_id)\n+{\n+\tint reg = (mbx_id == MBX_CM3CPU) ?\n+\t\tPF2CPU_COUNTER : PF2VF_COUNTER(mbx_id);\n+\tu32 v = mbx_rd32(hw, reg);\n+\tu16 ack;\n+\n+\tack = (v >> 16) & 0xffff;\n+\tack++;\n+\tv &= ~(0xffff0000);\n+\tv |= (ack << 16);\n+\n+\trte_mb();\n+\tmbx_wr32(hw, reg, v);\n+\n+\t/* update stats */\n+\t/* hw->mbx.stats.msgs_rx++; */\n+}\n+\n+/**\n+ *  rnp_poll_for_msg - Wait for message notification\n+ *  @hw: pointer to the HW structure\n+ *  @mbx_id: id of mailbox to write\n+ *\n+ *  returns SUCCESS if it successfully received a message notification\n+ **/\n+static int32_t rnp_poll_for_msg(struct rte_eth_dev *dev, enum MBX_ID mbx_id)\n+{\n+\tconst struct rnp_mbx_api *ops = RNP_DEV_TO_MBX_OPS(dev);\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(dev);\n+\tstruct rnp_mbx_info *mbx = &hw->mbx;\n+\tint countdown = mbx->timeout;\n+\n+\tif (!countdown || !ops->check_for_msg)\n+\t\tgoto out;\n+\n+\twhile (countdown && ops->check_for_msg(hw, mbx_id)) {\n+\t\tcountdown--;\n+\t\tif (!countdown)\n+\t\t\tbreak;\n+\t\trte_delay_us_block(mbx->usec_delay);\n+\t}\n+\n+out:\n+\treturn countdown ? 0 : -ETIME;\n+}\n+\n+/**\n+ *  rnp_poll_for_ack - Wait for message acknowledgment\n+ *  @hw: pointer to the HW structure\n+ *  @mbx_id: id of mailbox to write\n+ *\n+ *  returns SUCCESS if it successfully received a message acknowledgment\n+ **/\n+static int32_t rnp_poll_for_ack(struct rte_eth_dev *dev, enum MBX_ID mbx_id)\n+{\n+\tconst struct rnp_mbx_api *ops = RNP_DEV_TO_MBX_OPS(dev);\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(dev);\n+\tstruct rnp_mbx_info *mbx = &hw->mbx;\n+\tint countdown = mbx->timeout;\n+\n+\tif (!countdown || !ops->check_for_ack)\n+\t\tgoto out;\n+\n+\twhile (countdown && ops->check_for_ack(hw, mbx_id)) {\n+\t\tcountdown--;\n+\t\tif (!countdown)\n+\t\t\tbreak;\n+\t\trte_delay_us_block(mbx->usec_delay);\n+\t}\n+\n+out:\n+\treturn countdown ? 0 : -ETIME;\n+}\n+\n+/**\n+ *  rnp_read_posted_mbx - Wait for message notification and receive message\n+ *  @hw: pointer to the HW structure\n+ *  @msg: The message buffer\n+ *  @size: Length of buffer\n+ *  @mbx_id: id of mailbox to write\n+ *\n+ *  returns SUCCESS if it successfully received a message notification and\n+ *  copied it into the receive buffer.\n+ **/\n+static int32_t\n+rnp_read_posted_mbx_pf(struct rte_eth_dev *dev, u32 *msg, u16 size,\n+\t\t       enum MBX_ID mbx_id)\n+{\n+\tconst struct rnp_mbx_api *ops = RNP_DEV_TO_MBX_OPS(dev);\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(dev);\n+\tstruct rnp_mbx_info *mbx = &hw->mbx;\n+\tint countdown = mbx->timeout;\n+\tint32_t ret_val = -ETIME;\n+\n+\tif (!ops->read || !countdown)\n+\t\treturn -EOPNOTSUPP;\n+\n+\tret_val = rnp_poll_for_msg(dev, mbx_id);\n+\n+\t/* if ack received read message, otherwise we timed out */\n+\tif (!ret_val)\n+\t\treturn ops->read(hw, msg, size, mbx_id);\n+\treturn ret_val;\n+}\n+\n+/**\n+ *  rnp_write_posted_mbx - Write a message to the mailbox, wait for ack\n+ *  @hw: pointer to the HW structure\n+ *  @msg: The message buffer\n+ *  @size: Length of buffer\n+ *  @mbx_id: id of mailbox to write\n+ *\n+ *  returns SUCCESS if it successfully copied message into the buffer and\n+ *  received an ack to that message within delay * timeout period\n+ **/\n+static int32_t\n+rnp_write_posted_mbx_pf(struct rte_eth_dev *dev, u32 *msg, u16 size,\n+\t\t\tenum MBX_ID mbx_id)\n+{\n+\tconst struct rnp_mbx_api *ops = RNP_DEV_TO_MBX_OPS(dev);\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(dev);\n+\tstruct rnp_mbx_info *mbx = &hw->mbx;\n+\tint32_t ret_val = -ETIME;\n+\n+\t/* exit if either we can't write or there isn't a defined timeout */\n+\tif (!ops->write || !mbx->timeout)\n+\t\tgoto out;\n+\n+\t/* send msg and hold buffer lock */\n+\tif (ops->write)\n+\t\tret_val = ops->write(hw, msg, size, mbx_id);\n+\n+\t/* if msg sent wait until we receive an ack */\n+\tif (!ret_val)\n+\t\tret_val = rnp_poll_for_ack(dev, mbx_id);\n+out:\n+\treturn ret_val;\n+}\n+\n+/**\n+ *  rnp_check_for_msg_pf - checks to see if the VF has sent mail\n+ *  @hw: pointer to the HW structure\n+ *  @vf_number: the VF index\n+ *\n+ *  returns SUCCESS if the VF has set the Status bit or else ERR_MBX\n+ **/\n+static int32_t rnp_check_for_msg_pf(struct rnp_hw *hw, enum MBX_ID mbx_id)\n+{\n+\tint32_t ret_val = -ETIME;\n+\n+\tif (mbx_id == MBX_CM3CPU) {\n+\t\tif (rnp_mbx_get_req(hw, CPU2PF_COUNTER) != hw->mbx.cpu_req) {\n+\t\t\tret_val = 0;\n+\t\t\t/* hw->mbx.stats.reqs++; */\n+\t\t}\n+\t} else {\n+\t\tif (rnp_mbx_get_req(hw, VF2PF_COUNTER(mbx_id)) !=\n+\t\t\t\thw->mbx.vf_req[mbx_id]) {\n+\t\t\tret_val = 0;\n+\t\t\t/* hw->mbx.stats.reqs++; */\n+\t\t}\n+\t}\n+\n+\treturn ret_val;\n+}\n+\n+/**\n+ *  rnp_check_for_ack_pf - checks to see if the VF has ACKed\n+ *  @hw: pointer to the HW structure\n+ *  @vf_number: the VF index\n+ *\n+ *  returns SUCCESS if the VF has set the Status bit or else ERR_MBX\n+ **/\n+static int32_t rnp_check_for_ack_pf(struct rnp_hw *hw, enum MBX_ID mbx_id)\n+{\n+\tint32_t ret_val = -ETIME;\n+\n+\tif (mbx_id == MBX_CM3CPU) {\n+\t\tif (rnp_mbx_get_ack(hw, CPU2PF_COUNTER) != hw->mbx.cpu_ack) {\n+\t\t\tret_val = 0;\n+\t\t\t/* hw->mbx.stats.acks++; */\n+\t\t}\n+\t} else {\n+\t\tif (rnp_mbx_get_ack(hw, VF2PF_COUNTER(mbx_id)) != hw->mbx.vf_ack[mbx_id]) {\n+\t\t\tret_val = 0;\n+\t\t\t/* hw->mbx.stats.acks++; */\n+\t\t}\n+\t}\n+\n+\treturn ret_val;\n+}\n+\n+/**\n+ *  rnp_obtain_mbx_lock_pf - obtain mailbox lock\n+ *  @hw: pointer to the HW structure\n+ *  @mbx_id: the VF index or CPU\n+ *\n+ *  return SUCCESS if we obtained the mailbox lock\n+ **/\n+static int32_t rnp_obtain_mbx_lock_pf(struct rnp_hw *hw, enum MBX_ID mbx_id)\n+{\n+\tint32_t ret_val = -ETIME;\n+\tint try_cnt = 5000;  /* 500ms */\n+\tu32 CTRL_REG = (mbx_id == MBX_CM3CPU) ?\n+\t\tPF2CPU_MBOX_CTRL : PF2VF_MBOX_CTRL(mbx_id);\n+\n+\twhile (try_cnt-- > 0) {\n+\t\t/* Take ownership of the buffer */\n+\t\tmbx_wr32(hw, CTRL_REG, MBOX_CTRL_PF_HOLD_SHM);\n+\n+\t\t/* reserve mailbox for cm3 use */\n+\t\tif (mbx_rd32(hw, CTRL_REG) & MBOX_CTRL_PF_HOLD_SHM)\n+\t\t\treturn 0;\n+\t\trte_delay_us_block(100);\n+\t}\n+\n+\tRNP_PMD_LOG(WARNING, \"%s: failed to get:%d lock\\n\",\n+\t\t\t__func__, mbx_id);\n+\treturn ret_val;\n+}\n+\n+/**\n+ *  rnp_write_mbx_pf - Places a message in the mailbox\n+ *  @hw: pointer to the HW structure\n+ *  @msg: The message buffer\n+ *  @size: Length of buffer\n+ *  @mbx_id: the VF index\n+ *\n+ *  returns SUCCESS if it successfully copied message into the buffer\n+ **/\n+static int32_t rnp_write_mbx_pf(struct rnp_hw *hw, u32 *msg,\n+\t\t\t\tu16 size, enum MBX_ID mbx_id)\n+{\n+\tu32 DATA_REG = (mbx_id == MBX_CM3CPU) ?\n+\t\tCPU_PF_SHM_DATA : PF_VF_SHM_DATA(mbx_id);\n+\tu32 CTRL_REG = (mbx_id == MBX_CM3CPU) ?\n+\t\tPF2CPU_MBOX_CTRL : PF2VF_MBOX_CTRL(mbx_id);\n+\tint32_t ret_val = 0;\n+\tu32 stat __rte_unused;\n+\tu16 i;\n+\n+\tif (size > RNP_VFMAILBOX_SIZE) {\n+\t\tRNP_PMD_LOG(ERR, \"%s: size:%d should <%d\\n\", __func__,\n+\t\t\t\tsize, RNP_VFMAILBOX_SIZE);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* lock the mailbox to prevent pf/vf/cpu race condition */\n+\tret_val = rnp_obtain_mbx_lock_pf(hw, mbx_id);\n+\tif (ret_val) {\n+\t\tRNP_PMD_LOG(WARNING, \"PF[%d] Can't Get Mbx-Lock Try Again\\n\",\n+\t\t\t\thw->function);\n+\t\treturn ret_val;\n+\t}\n+\n+\t/* copy the caller specified message to the mailbox memory buffer */\n+\tfor (i = 0; i < size; i++) {\n+#ifdef MBX_WR_DEBUG\n+\t\tmbx_pwr32(hw, DATA_REG + i * 4, msg[i]);\n+#else\n+\t\tmbx_wr32(hw, DATA_REG + i * 4, msg[i]);\n+#endif\n+\t}\n+\n+\t/* flush msg and acks as we are overwriting the message buffer */\n+\tif (mbx_id == MBX_CM3CPU)\n+\t\thw->mbx.cpu_ack = rnp_mbx_get_ack(hw, CPU2PF_COUNTER);\n+\telse\n+\t\thw->mbx.vf_ack[mbx_id] = rnp_mbx_get_ack(hw, VF2PF_COUNTER(mbx_id));\n+\n+\trnp_mbx_inc_pf_req(hw, mbx_id);\n+\trte_mb();\n+\n+\trte_delay_us(300);\n+\n+\t/* Interrupt VF/CM3 to tell it a message\n+\t * has been sent and release buffer\n+\t */\n+\tmbx_wr32(hw, CTRL_REG, MBOX_CTRL_REQ);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ *  rnp_read_mbx_pf - Read a message from the mailbox\n+ *  @hw: pointer to the HW structure\n+ *  @msg: The message buffer\n+ *  @size: Length of buffer\n+ *  @vf_number: the VF index\n+ *\n+ *  This function copies a message from the mailbox buffer to the caller's\n+ *  memory buffer.  The presumption is that the caller knows that there was\n+ *  a message due to a VF/CPU request so no polling for message is needed.\n+ **/\n+static int32_t rnp_read_mbx_pf(struct rnp_hw *hw, u32 *msg,\n+\t\t\t       u16 size, enum MBX_ID mbx_id)\n+{\n+\tu32 BUF_REG  = (mbx_id == MBX_CM3CPU) ?\n+\t\tCPU_PF_SHM_DATA : PF_VF_SHM_DATA(mbx_id);\n+\tu32 CTRL_REG = (mbx_id == MBX_CM3CPU) ?\n+\t\tPF2CPU_MBOX_CTRL : PF2VF_MBOX_CTRL(mbx_id);\n+\tint32_t ret_val = -EIO;\n+\tu32 stat __rte_unused, i;\n+\tif (size > RNP_VFMAILBOX_SIZE) {\n+\t\tRNP_PMD_LOG(ERR, \"%s: size:%d should <%d\\n\", __func__,\n+\t\t\t\tsize, RNP_VFMAILBOX_SIZE);\n+\t\treturn -EINVAL;\n+\t}\n+\t/* lock the mailbox to prevent pf/vf race condition */\n+\tret_val = rnp_obtain_mbx_lock_pf(hw, mbx_id);\n+\tif (ret_val)\n+\t\tgoto out_no_read;\n+\n+\t/* copy the message from the mailbox memory buffer */\n+\tfor (i = 0; i < size; i++) {\n+#ifdef MBX_RD_DEBUG\n+\t\tmsg[i] = mbx_prd32(hw, BUF_REG + 4 * i);\n+#else\n+\t\tmsg[i] = mbx_rd32(hw, BUF_REG + 4 * i);\n+#endif\n+\t}\n+\tmbx_wr32(hw, BUF_REG, 0);\n+\n+\t/* update req. used by rnpvf_check_for_msg_vf  */\n+\tif (mbx_id == MBX_CM3CPU)\n+\t\thw->mbx.cpu_req = rnp_mbx_get_req(hw, CPU2PF_COUNTER);\n+\telse\n+\t\thw->mbx.vf_req[mbx_id] = rnp_mbx_get_req(hw, VF2PF_COUNTER(mbx_id));\n+\n+\t/* this ack maybe too earier? */\n+\t/* Acknowledge receipt and release mailbox, then we're done */\n+\trnp_mbx_inc_pf_ack(hw, mbx_id);\n+\n+\trte_mb();\n+\n+\t/* free ownership of the buffer */\n+\tmbx_wr32(hw, CTRL_REG, 0);\n+\n+out_no_read:\n+\n+\treturn ret_val;\n+}\n+\n+static void rnp_mbx_reset_pf(struct rnp_hw *hw)\n+{\n+\tint v;\n+\n+\t/* reset pf->cm3 status */\n+\tv = mbx_rd32(hw, CPU2PF_COUNTER);\n+\thw->mbx.cpu_req = v & 0xffff;\n+\thw->mbx.cpu_ack = (v >> 16) & 0xffff;\n+\t/* release   pf->cm3 buffer lock */\n+\tmbx_wr32(hw, PF2CPU_MBOX_CTRL, 0);\n+\n+\trte_mb();\n+\t/* enable irq to fw */\n+\tmbx_wr32(hw, CPU_PF_MBOX_MASK, 0);\n+}\n+\n+static int get_pfvfnum(struct rnp_hw *hw)\n+{\n+\tuint32_t addr_mask;\n+\tuint32_t offset;\n+\tuint32_t val;\n+#define RNP_PF_NUM_REG       (0x75f000)\n+#define RNP_PFVF_SHIFT       (4)\n+#define RNP_PF_SHIFT         (6)\n+#define RNP_PF_BIT_MASK      BIT(6)\n+\taddr_mask = hw->iobar0_len - 1;\n+\toffset = RNP_PF_NUM_REG & addr_mask;\n+\tval = rnp_rd_reg(hw->iobar0 + offset);\n+\n+\treturn val >> RNP_PFVF_SHIFT;\n+}\n+\n+const struct rnp_mbx_api rnp_mbx_pf_ops = {\n+\t.read           = rnp_read_mbx_pf,\n+\t.write          = rnp_write_mbx_pf,\n+\t.read_posted    = rnp_read_posted_mbx_pf,\n+\t.write_posted   = rnp_write_posted_mbx_pf,\n+\t.check_for_msg  = rnp_check_for_msg_pf,\n+\t.check_for_ack  = rnp_check_for_ack_pf,\n+};\n+\n+void *rnp_memzone_reserve(const char *name, unsigned int size)\n+{\n+#define NO_FLAGS 0\n+\tconst struct rte_memzone *mz = NULL;\n+\n+\tif (name) {\n+\t\tif (size) {\n+\t\t\tmz = rte_memzone_reserve(name, size,\n+\t\t\t\t\trte_socket_id(), NO_FLAGS);\n+\t\t\tif (mz)\n+\t\t\t\tmemset(mz->addr, 0, size);\n+\t\t} else {\n+\t\t\tmz = rte_memzone_lookup(name);\n+\t\t}\n+\t\treturn mz ? mz->addr : NULL;\n+\t}\n+\treturn NULL;\n+}\n+\n+void rnp_init_mbx_ops_pf(struct rnp_hw *hw)\n+{\n+\tstruct rnp_eth_adapter *adapter = hw->back;\n+\tstruct rnp_mbx_info *mbx = &hw->mbx;\n+\tstruct mbx_req_cookie *cookie;\n+\tuint32_t vf_isolat_off;\n+\n+\tmbx->size       = RNP_VFMAILBOX_SIZE;\n+\tmbx->usec_delay = RNP_MBX_DELAY_US;\n+\tmbx->timeout    = (RNP_MBX_TIMEOUT_SECONDS * 1000 * 1000) /\n+\t\tmbx->usec_delay;\n+\tif (hw->device_id == RNP_DEV_ID_N10G) {\n+\t\tvf_isolat_off = RNP_VF_ISOLATE_CTRL &\n+\t\t\t(hw->iobar0_len - 1);\n+\t\trnp_wr_reg(hw->iobar0 + vf_isolat_off, 0);\n+\t}\n+\tmbx->sriov_st = 0;\n+\thw->pf_vf_num = get_pfvfnum(hw);\n+\tmbx->vf_num = UINT16_MAX;\n+\tmbx->pf_num = (hw->pf_vf_num & RNP_PF_BIT_MASK) >> RNP_PF_SHIFT;\n+\thw->function = mbx->pf_num;\n+\t/* Retrieving and storing the HW base address of device */\n+\trnp_reg_offset_init(hw);\n+\tsnprintf(hw->cookie_p_name, RTE_MEMZONE_NAMESIZE, \"mbx_req_cookie%d_%d\",\n+\t\t\thw->function, adapter->eth_dev->data->port_id);\n+\thw->cookie_pool = rnp_memzone_reserve(hw->cookie_p_name,\n+\t\t\tsizeof(struct mbx_req_cookie));\n+\n+\tcookie = (struct mbx_req_cookie *)hw->cookie_pool;\n+\tif (cookie) {\n+\t\tcookie->timeout_ms = 1000;\n+\t\tcookie->magic = COOKIE_MAGIC;\n+\t\tcookie->priv_len = RNP_MAX_SHARE_MEM;\n+\t}\n+\n+\trnp_mbx_reset_pf(hw);\n+}\ndiff --git a/drivers/net/rnp/rnp_mbx.h b/drivers/net/rnp/rnp_mbx.h\nnew file mode 100644\nindex 0000000000..87949c1726\n--- /dev/null\n+++ b/drivers/net/rnp/rnp_mbx.h\n@@ -0,0 +1,139 @@\n+#ifndef __TSRN10_MBX_H__\n+#define __TSRN10_MBX_H__\n+\n+#define VF_NUM_MASK_TEMP\t(0xff0)\n+#define VF_NUM_OFF\t\t(4)\n+#define RNP_VF_NUM\t\t(0x75f000)\n+#define RNP_VF_NB_MASK\t\t(0x3f)\n+#define RNP_PF_NB_MASK\t\t(0x40)\n+#define RNP_VF_ISOLATE_CTRL\t(0x7982fc)\n+#define RNP_IS_SRIOV\t\tBIT(7)\n+#define RNP_SRIOV_ST_SHIFT\t(24)\n+#define RNP_VF_DEFAULT_PORT\t(0)\n+\n+/* Mbx Ctrl state */\n+#define RNP_VFMAILBOX_SIZE\t(14) /* 16 32 bit words - 64 bytes */\n+#define TSRN10_VFMBX_SIZE\t(RNP_VFMAILBOX_SIZE)\n+#define RNP_VT_MSGTYPE_ACK\t(0x80000000)\n+\n+#define RNP_VT_MSGTYPE_NACK\t(0x40000000)\n+/* Messages below or'd with * this are the NACK */\n+#define RNP_VT_MSGTYPE_CTS\t(0x20000000)\n+/* Indicates that VF is still\n+ *clear to send requests\n+ */\n+#define RNP_VT_MSGINFO_SHIFT\t(16)\n+\n+#define RNP_VT_MSGINFO_MASK\t(0xFF << RNP_VT_MSGINFO_SHIFT)\n+/* The mailbox memory size is 64 bytes accessed by 32-bit registers */\n+#define RNP_VLVF_VIEN\t\t(0x80000000) /* filter is valid */\n+#define RNP_VLVF_ENTRIES\t(64)\n+#define RNP_VLVF_VLANID_MASK\t(0x00000FFF)\n+/* Every VF own 64 bytes mem for communitate accessed by 32-bit */\n+\n+#define RNP_VF_RESET\t\t(0x01) /* VF requests reset */\n+#define RNP_VF_SET_MAC_ADDR\t(0x02) /* VF requests PF to set MAC addr */\n+#define RNP_VF_SET_MULTICAST\t(0x03) /* VF requests PF to set MC addr */\n+#define RNP_VF_SET_VLAN\t\t(0x04) /* VF requests PF to set VLAN */\n+\n+#define RNP_VF_SET_LPE\t\t(0x05) /* VF requests PF to set VMOLR.LPE */\n+#define RNP_VF_SET_MACVLAN\t(0x06) /* VF requests PF for unicast filter */\n+#define RNP_VF_GET_MACVLAN\t(0x07) /* VF requests mac */\n+#define RNP_VF_API_NEGOTIATE\t(0x08) /* negotiate API version */\n+#define RNP_VF_GET_QUEUES\t(0x09) /* get queue configuration */\n+#define RNP_VF_GET_LINK\t\t(0x10) /* get link status */\n+\n+#define RNP_VF_SET_VLAN_STRIP\t(0x0a) /* VF Requests PF to set VLAN STRIP */\n+#define RNP_VF_REG_RD\t\t(0x0b) /* VF Read Reg */\n+#define RNP_VF_GET_MAX_MTU\t(0x0c) /* VF Get Max Mtu */\n+#define RNP_VF_SET_MTU\t\t(0x0d) /* VF Set Mtu */\n+#define RNP_VF_GET_FW\t\t(0x0e) /* VF Get Firmware Version */\n+\n+#define RNP_PF_VFNUM_MASK\tGENMASK(26, 21)\n+\n+#define RNP_PF_SET_FCS\t\t(0x10) /* PF set fcs status */\n+#define RNP_PF_SET_PAUSE\t(0x11) /* PF set pause status */\n+#define RNP_PF_SET_FT_PADDING\t(0x12) /* PF set ft padding status */\n+#define RNP_PF_SET_VLAN_FILTER\t(0x13) /* PF set ntuple status */\n+#define RNP_PF_SET_VLAN\t\t(0x14)\n+#define RNP_PF_SET_LINK\t\t(0x15)\n+#define RNP_PF_SET_SPEED_40G\tBIT(8)\n+#define RNP_PF_SET_SPEED_10G\tBIT(7)\n+#define RNP_PF_SET_SPEED_1G\tBIT(5)\n+#define RNP_PF_SET_SPEED_100M\tBIT(3)\n+\n+#define RNP_PF_SET_MTU\t\t(0x16)\n+#define RNP_PF_SET_RESET\t(0x17)\n+#define RNP_PF_LINK_UP\t\tBIT(31)\n+#define RNP_PF_SPEED_MASK\tGENMASK(15, 0)\n+\n+/* Define mailbox register bits */\n+#define RNP_PF_REMOVE\t\t(0x0f)\n+\n+/* Mailbox API ID VF Request */\n+/* length of permanent address message returned from PF */\n+#define RNP_VF_PERMADDR_MSG_LEN (11)\n+#define RNP_VF_TX_QUEUES\t(1) /* number of Tx queues supported */\n+#define RNP_VF_RX_QUEUES\t(2) /* number of Rx queues supported */\n+#define RNP_VF_TRANS_VLAN\t(3) /* Indication of port vlan */\n+#define RNP_VF_DEF_QUEUE\t(4) /* Default queue offset */\n+/* word in permanent address message with the current multicast type */\n+#define RNP_VF_VLAN_WORD\t(5)\n+#define RNP_VF_PHY_TYPE_WORD\t(6)\n+#define RNP_VF_FW_VERSION_WORD\t(7)\n+#define RNP_VF_LINK_STATUS_WORD\t(8)\n+#define RNP_VF_AXI_MHZ\t\t(9)\n+#define RNP_VF_RNP_VF_FEATURE\t(10)\n+#define RNP_VF_RNP_VF_FILTER_EN\tBIT(0)\n+\n+#define RNP_LINK_SPEED_UNKNOWN 0\n+#define RNP_LINK_SPEED_10_FULL    BIT(2)\n+#define RNP_LINK_SPEED_100_FULL   BIT(3)\n+#define RNP_LINK_SPEED_1GB_FULL   BIT(4)\n+#define RNP_LINK_SPEED_10GB_FULL  BIT(5)\n+#define RNP_LINK_SPEED_40GB_FULL  BIT(6)\n+#define RNP_LINK_SPEED_25GB_FULL  BIT(7)\n+#define RNP_LINK_SPEED_50GB_FULL  BIT(8)\n+#define RNP_LINK_SPEED_100GB_FULL BIT(9)\n+#define RNP_LINK_SPEED_10_HALF    BIT(10)\n+#define RNP_LINK_SPEED_100_HALF   BIT(11)\n+#define RNP_LINK_SPEED_1GB_HALF   BIT(12)\n+\n+/* Mailbox API ID PF Request */\n+#define RNP_VF_MC_TYPE_WORD\t\t(3)\n+#define RNP_VF_DMA_VERSION_WORD\t\t(4)\n+/* Get Queue write-back reference value */\n+#define RNP_PF_CONTROL_PRING_MSG\t(0x0100) /* PF control message */\n+\n+#define TSRN10_MBX_VECTOR_ID            (0)\n+#define TSRN10_PF2VF_MBX_VEC_CTR(n)     (0xa5000 + 0x4 * (n))\n+\n+#define RNP_VF_INIT_TIMEOUT\t\t(200) /* Number of retries to clear RSTI */\n+#define RNP_VF_MBX_INIT_TIMEOUT\t\t(2000) /* number of retries on mailbox */\n+\n+#define MBOX_CTRL_REQ\t\t\t(1 << 0) /* WO */\n+#define MBOX_CTRL_VF_HOLD_SHM\t\t(1 << 2) /* VF:WR, PF:RO */\n+#define VF_NUM_MASK 0x3f\n+#define VFNUM(num)\t\t\t((num) & VF_NUM_MASK)\n+\n+#define PF_VF_SHM(vf)\t\\\n+\t((0xa6000) + (64 * (vf))) /* for PF1 rtl will remap 6000 to 0xb000 */\n+#define PF2VF_COUNTER(vf)\t\t(PF_VF_SHM(vf) + 0)\n+#define VF2PF_COUNTER(vf)\t\t(PF_VF_SHM(vf) + 4)\n+#define PF_VF_SHM_DATA(vf)\t\t(PF_VF_SHM(vf) + 8)\n+#define VF2PF_MBOX_CTRL(vf)\t\t((0xa7000) + (4 * (vf)))\n+\n+/* Error Codes */\n+#define RNP_ERR_INVALID_MAC_ADDR\t(-1)\n+#define RNP_ERR_MBX\t\t\t(-100)\n+\n+#define RNP_MBX_DELAY_US\t\t(100) /* Delay us for Retry */\n+/* Max Retry Time */\n+#define RNP_MBX_TIMEOUT_SECONDS\t(2) /* Max Retry Time 2s */\n+#define RNP_ARRAY_OPCODE_OFFSET\t(0)\n+#define RNP_ARRAY_CTRL_OFFSET\t(1)\n+\n+void rnp_init_mbx_ops_pf(struct rnp_hw *hw);\n+extern const struct rnp_mbx_api rnp_mbx_pf_ops;\n+void *rnp_memzone_reserve(const char *name, unsigned int size);\n+#endif\ndiff --git a/drivers/net/rnp/rnp_mbx_fw.h b/drivers/net/rnp/rnp_mbx_fw.h\nnew file mode 100644\nindex 0000000000..439090b5a3\n--- /dev/null\n+++ b/drivers/net/rnp/rnp_mbx_fw.h\n@@ -0,0 +1,22 @@\n+#ifndef __RNP_MBX_FW_H__\n+#define __RNP_MBX_FW_H__\n+\n+struct mbx_fw_cmd_reply;\n+typedef void (*cookie_cb)(struct mbx_fw_cmd_reply *reply, void *priv);\n+#define RNP_MAX_SHARE_MEM (8 * 8)\n+struct mbx_req_cookie {\n+\tint magic;\n+#define COOKIE_MAGIC 0xCE\n+\tcookie_cb cb;\n+\tint timeout_ms;\n+\tint errcode;\n+\n+\t/* wait_queue_head_t wait; */\n+\tvolatile int done;\n+\tint priv_len;\n+\tchar priv[RNP_MAX_SHARE_MEM];\n+};\n+struct mbx_fw_cmd_reply {\n+} __rte_cache_aligned;\n+\n+#endif /* __RNP_MBX_FW_H__*/\n",
    "prefixes": [
        "v2",
        "4/8"
    ]
}